堆叠for循环vs while循环(C ++)

时间:2020-07-30 20:32:50

标签: c++ stack

为什么不能使用for循环打印堆栈中的所有项目?由于某种原因,它仅打印出3和2,但是缺少1。但是,当我注释掉for循环并使用下面的while循环时,它可以完美地工作。我在了解for循环的问题时遇到了麻烦,因为我已经找到了问题,并且还应该包括1。大小为3,所以当我= 0时,我们打印3并弹出。当I = 1时,我们打印2并弹出,当I = 2时,我们打印1并弹出。然后I = 3,我们退出循环。有人可以解释这个问题吗?谢谢!

#include <iostream>
#include <stack>

using std::cout;
using std::endl;
using std::stack;

int main(int argc, const char * argv[])
{
    stack<int> nums;
    
    nums.push(1);
    nums.push(2);
    nums.push(3);
    
    cout << "Size is: " << nums.size() << endl;

    /*
    for (int i = 0; i < nums.size(); i++)
    {
        cout << nums.top() << endl;
        nums.pop();
    }
    */
    
    while (!nums.empty())
    {
        cout << nums.top() << endl;
        nums.pop();
    }
    
    return 0;
}

1 个答案:

答案 0 :(得分:2)

在此循环中:

for (int i = 0; i < nums.size(); i++)
{
    cout << nums.top() << endl;
    nums.pop();
}

您同时都是{em> 递增i,并在执行nums时修改pop()的大小。这意味着您在每次迭代中都 over-counting ,并且在此循环中将跳过打印堆栈的下半部分。

例如如果堆栈大小为3,则:

iteration 1: i = 0, nums.size() = 3
iteration 2: i = 1, nums.size() = 2
iteration 3: i = 2, nums.size() = 1 (oops, comparison fails here)

如果您想要与while循环类似的行为,则可以预先计算nums的大小,并在以下条件下使用该值:

for (int i = 0, size = nums.size(); i < size; i++)
{
    cout << nums.top() << endl;
    nums.pop();
}