我试图从上到下输出堆栈,这很容易。但是,在我运行下面的代码之后。
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'
。虽然我已经找到了正确的输出方法,但我仍然很困惑我的错误在哪里。
当您调用pop()
时,顶部元素被删除,将其他元素向上移动一个槽,并且size()
被减少。所以,第二个元素现在是第一个元素,第三个元素现在是第二个元素,以此类推。然后增加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();
}