因此,我有一个使用堆栈库的教程创建的堆栈示例
stack<string> custs;
custs.push("george");
custs.push("louie");
custs.push("florence");
// cout << "size" << custs.size() << endl;
if (!custs.empty()) {
for (int i = 0; i <= custs.size(); i++) {
cout << custs.top() << endl;
custs.pop();
}
}
我运行了这个并得到了输出: 佛罗伦萨 路易斯
我的问题是为什么它也不输出乔治?程序输出顶部数据,然后将其弹出。这意味着它应该输出Gorge,然后将其弹出。为什么不发生这种情况?最初的代码是i
答案 0 :(得分:4)
这是因为你们都在增加i
并在循环中减小堆栈的大小。
您可以这样重写循环:
while (!custs.empty()) {
cout << custs.top() << endl;
custs.pop()
}
答案 1 :(得分:3)
这里是逐步说明正在发生的事情,以便您可以更好地理解它:
首先,i
从0开始,并且custs.size()
返回3。由于0 <= 3
为true
,因此循环体执行,打印“佛罗伦萨”并将其删除。从堆栈中。
在第二次迭代中,i
等于1,而custs.size()
返回2,因为您有3个项目,但是删除了一个。由于1 <= 2
是true
,因此循环的主体再次执行,打印“ louie”并将其从堆栈中删除。
然后,i
等于2,并且custs.size()
返回1,因为您已经删除了2个元素。由于2 <= 1
为false
,因此循环的主体不执行,并且循环结束。
如您所见,问题在于循环的条件在每次迭代中都会改变。有两种方法可以解决此问题:
int s = custs.size();
for (int i = 0; i < s; i++) {
cout << custs.top() << endl;
custs.pop();
}
这样做,您可以存储堆栈的原始大小,因此可以进行迭代而不会出现问题。
另一种解决方案是使用while
循环在每次迭代中检查堆栈是否为空:
while (!custs.empty()) {
cout << custs.top() << endl;
custs.pop();
}
这样做,您可以检查每次是否还有要打印的元素。
希望这会有所帮助!
答案 2 :(得分:1)
当您使用这样的for循环
for (int i = 0; i <= custs.size(); i++) {
cout << custs.top() << endl;
custs.pop();
}
它直接循环直到堆栈的大小在每次迭代中减小。 我认为这是您的代码无法正常工作的主要原因。我将其重写为
int z = custs.size() ;
for(int i=0;i<=z;i++)
{
cout<<custs.top()<<endl;
custs.pop();
}
,它工作得很好。我认为,最好的方法是像这样使用while loop
while(!custs.empty())
{
cout<<custs.top()<<endl;
custs.pop();
}