无法弄清楚这个堆栈输出C ++

时间:2020-05-04 03:50:53

标签: c++

因此,我有一个使用堆栈库的教程创建的堆栈示例

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

3 个答案:

答案 0 :(得分:4)

这是因为你们都在增加i并在循环中减小堆栈的大小。

您可以这样重写循环:

while (!custs.empty()) {
    cout << custs.top() << endl;
    custs.pop()
}

答案 1 :(得分:3)

这里是逐步说明正在发生的事情,以便您可以更好地理解它:

首先,i从0开始,并且custs.size()返回3。由于0 <= 3true,因此循环体执行,打印“佛罗伦萨”并将其删除。从堆栈中。

在第二次迭代中,i等于1,而custs.size()返回2,因为您有3个项目,但是删除了一个。由于1 <= 2true,因此循环的主体再次执行,打印“ louie”并将其从堆栈中删除。

然后,i等于2,并且custs.size()返回1,因为您已经删除了2个元素。由于2 <= 1false,因此循环的主体执行,并且循环结束。

如您所见,问题在于循环的条件在每次迭代中都会改变。有两种方法可以解决此问题:

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();
    }
相关问题