我正在做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;
}
答案 0 :(得分:4)
out_s = s.top();
if(!s.empty() && out_s == take) s.pop();
在这里,您首先访问堆栈的顶部元素,然后检查堆栈是否实际包含任何内容。
在修改后的代码中,top()
调用由empty()
和逻辑&保护,因此当容器为空时不会发生。