Почему очередь перестала перемещаться по срединному элементу?

#c #iterator #queue

#c #итератор #очередь

Вопрос:

Когда я пытаюсь проверить коррекцию моего постфиксного выражения, выполняемые выходные значения прерываются в середине элементов в очереди. От 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.2fn",Cal());*/
        node t;
        printf("%dn",q.size());
        for(int i = 0;i<q.size() amp;amp; !q.empty();i  ){
            t = q.front();
            if(t.flag == true){
                printf("%.0f ",t.num);
            }else{
                printf("%c ",t.op);
            }
            printf("%dn",q.size());
                q.pop();
        }
        printf("n");
    }

    system("pause");
    return 0;
}
  

И это мой скриншот входного выражения и выходного значения:
выходные значения

Комментарии:

1. Предупреждение: In printf("%dn",q.size()); , q.size() не имеет подходящего типа для a %d . По крайней мере, это должно быть %u и, возможно, должно быть %lu или %llu . Безопаснее использовать cout << здесь, потому что гарантируется правильная << перегрузка.

Ответ №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() amp;amp; !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;
}