为什么队列停止在中间元素处遍历?

时间:2020-10-31 05:25:47

标签: c++ iterator queue

当我尝试检查后缀表达式的更正时,执行的输出值在队列中元素的中间中断。 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;
}

这是我的输入表达式和输出值的屏幕截图: the output values

1 个答案:

答案 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;
}