#c #stack #output
Вопрос:
Я пытаюсь вывести стек сверху вниз, что довольно просто. Однако после того, как я выполню приведенный ниже код.
stack<int> myS;
for (int i = 0; i < 6; i )
{
myS.push(1);
}
for (int i = 0; i < myS.size(); i )
{
cout << myS.top();
myS.pop();
}
Вывод '111'
вместо '111111'
. Хотя я нашел правильный способ его вывода, я все еще довольно смущен тем, где моя ошибка.
Комментарии:
1. Почему у вас
myS.pop()
… как вы думаете, что делает эта линия?2. Это ваш собственный класс стека или
std::stack
?3. С каждым вызовом pop() размер стека уменьшается на единицу. Таким образом, после 3 итераций i равно 3, а myS.size() также равно 3, и цикл завершается
Ответ №1:
Когда вы вызываете pop()
, верхний элемент удаляется, перемещая другие элементы вверх по слоту, и size()
он уменьшается. Итак, 2-й элемент теперь является 1-м элементом, 3-й элемент теперь является 2-м элементом и так далее. Затем вы увеличиваете i
, чтобы он указывал мимо недавно перемещенного верхнего элемента на следующий элемент. Из-за этого ваш цикл останавливается, когда он достигает точки на полпути в стеке.
Давайте развернем вашу pop
петлю, чтобы увидеть, что она на самом деле делает:
// size=6
i = 0;
cout << myS.top(); // print 1
myS.pop(); // size=5
i ; //i=1
cout << myS.top(); // print 1
myS.pop(); // size=4
i ; // i=2
cout << myS.top(); // print 1
myS.pop(); // size=3
i ; // i=3
// i == size(), STOP
Вот почему вы видите напечатанными только 3 1
с.
Чтобы решить эту проблему, вы можете вместо этого сделать цикл в обратном направлении:
for(int i = myS.size(); i > 0; --i)
{
cout << myS.top();
myS.pop();
}
Или while
вместо этого используйте цикл:
while (myS.size() > 0) // or: while (!myS.empty())
{
cout << myS.top();
myS.pop();
}