当我尝试检查后缀表达式的更正时,执行的输出值在队列中元素的中间中断。 IDE没有任何提示,但是可以确定我的代码中存在一些问题。为什么会发生?
这是我的测试代码:
int main(){
op['('] = 0;
op['+'] = op['-'] = 1;
op['*'] = op['/'] = 2;
while(getline(cin,str),str != "0"){//save the nifix expression
for(string::iterator it = str.begin();it != str.end();it++){//checking progress
if(*it == ' ') str.erase(it);
}
while(!s.empty()) s.pop();
Change();
/*printf("%d.2f\n",Cal());*/
node t;
printf("%d\n",q.size());
for(int i = 0;i<q.size() && !q.empty();i++){
t = q.front();
if(t.flag == true){
printf("%.0f ",t.num);
}else{
printf("%c ",t.op);
}
printf("%d\n",q.size());
q.pop();
}
printf("\n");
}
system("pause");
return 0;
}
答案 0 :(得分:1)
让我们以具有相同循环逻辑的完整但简单的示例开始:
#include <iostream>
#include <queue>
using namespace std;
int main()
{
//Make a queue
queue<int> q;
// put a few items in it
for (int count = 1 ; count < 6; count++) q.push(count);
// run asker's logic
for (int index = 0; index < q.size() && !q.empty(); index++)
{
cout << "Index: " << index << ',' << " Queue size: " << q.size() << endl;
q.pop();
}
return 0;
}
这将提供以下输出:
Index: 0, Queue size: 5
Index: 1, Queue size: 4
Index: 2, Queue size: 3
由此我们可以看到,在循环运行时,索引增大,队列大小减小。他们在中间相遇,循环停止。
简单的解决方案:摆脱索引并循环直到为空。
#include <iostream>
#include <queue>
using namespace std;
int main()
{
//Make a queue
queue<int> q;
// put a few items in it
for (int count = 1 ; count < 6; count++) q.push(count);
// run asker's logic
for (int index = 0; !q.empty(); index++)
{
cout << "index: " << index << ',' << " Queue size: " << q.size() << endl;
q.pop();
}
return 0;
}
现在的输出是
index: 0, Queue size: 5
index: 1, Queue size: 4
index: 2, Queue size: 3
index: 3, Queue size: 2
index: 4, Queue size: 1
我们可以进一步简化事情,因为我们根本不对索引进行任何废话
#include <iostream>
#include <queue>
using namespace std;
int main()
{
//Make a queue
queue<int> q;
// put a few items in it
for (int count = 1 ; count < 6; count++) q.push(count);
// run asker's logic
while (!q.empty())
{
cout << "Queue size: " << q.size() << endl;
q.pop();
}
return 0;
}