#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;
}