为什么我只输出一半大小的堆栈?c++



我试图从上到下输出堆栈,这很容易。但是,在我运行下面的代码之后。

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();
}

最新更新