为什么不能使用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;
}
答案 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();
}