访问堆栈和队列的运行时错误

时间:2013-09-03 17:46:55

标签: c++ stack queue

我正在做UVa在线评审问题 - 11995。我在调试后发现了一些让我感到困惑的事。

在调试之前,这是我的代码的一部分,我收到了“运行时错误”。

int take;
scanf("%d", &take);
int out_s;
int out_q;
int out_p;
if(sta){
     out_s = s.top();
     if(!s.empty() && out_s == take) s.pop();
     else sta = 0;
}
if(que){
     out_q = q.front();
     if(!q.empty() && out_q == take) q.pop();
     else que = 0;
}
if(pri){
     out_p = p.top();
     if(!p.empty() && out_p == take) p.pop();
     else pri = 0;
}

在我刚刚删除了一些愚蠢的整数赋值之后,我得到了一个“已接受”的

int take;
scanf("%d", &take);
if(sta){
     if(!s.empty() && s.top() == take) s.pop();
     else sta = 0;
}
if(que){
     if(!q.empty() && q.front() == take) q.pop();
     else que = 0;
}
if(pri){
     if(!p.empty() && p.top() == take) p.pop();
     else pri = 0;
}

我真的不明白为什么我因为分配变量而得到运行时错误。

以下是我的全部代码:

using namespace std;

int main ()
{
    int n;
    while(scanf("%d", &n) != EOF){
        int comm;
        stack<int> s;
        queue<int> q;
        priority_queue<int> p;
        bool sta = 1;
        bool que = 1;
        bool pri = 1;
        for(int i = 0; i < n; i++){
            scanf("%d", &comm);
            if(comm == 1){
                int input;
                scanf("%d", &input);
                s.push(input);
                q.push(input);
                p.push(input);
            }
            else{
                int take;
                scanf("%d", &take);
                int out_s;
                int out_q;
                int out_p;
                if(sta){
                   out_s = s.top();
                   if(!s.empty() && out_s == take) s.pop();
                   else sta = 0;
                }
                if(que){
                    out_q = q.front();
                    if(!q.empty() && out_q == take) q.pop();
                    else que = 0;
                }
                if(pri){
                    out_p = p.top();
                    if(!p.empty() && out_p == take) p.pop();
                    else pri = 0;
                }                
            }
        }

        if(sta == 1 && que == 0 && pri == 0) printf("stack\n");
        else if(sta == 0 && que == 1 && pri == 0) printf("queue\n");
        else if(sta == 0 && que == 0 && pri == 1) printf("priority queue\n");
        else if(sta == 0 && que == 0 && pri == 0) printf("impossible\n");
        else printf("not sure\n");
}
return 0;
}

1 个答案:

答案 0 :(得分:4)

 out_s = s.top();
 if(!s.empty() && out_s == take) s.pop();

在这里,您首先访问堆栈的顶部元素,然后检查堆栈是否实际包含任何内容。

在修改后的代码中,top()调用由empty()和逻辑&保护,因此当容器为空时不会发生。