-3

我正在做 UVa Online Judge Question - 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;
}
4

1 回答 1

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

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

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

于 2013-09-03T17:50:35.590 回答