关于'Stack'基本题的问题(C++)
Question about the 'Stack' basic problem (C++)
我是一名学习基础算法的学生。
我写了一个代码来通过 stl:stack
.
获得所有元素的总和
#include <bits/stdc++.h>
using namespace std;
int main(void)
{
ios::sync_with_stdio(0);
cin.tie(0);
int k; cin >> k;
stack<int> s;
int answer=0;
while (k--)
{
int n; cin >> n;
if (n == 0)
{
s.pop();
}
else
{
s.push(n);
}
}
for (int i = 0; i < s.size(); i++)
{
answer = answer + s.top();
s.pop();
}
cout << answer;
}
输入:
5 5 4 3 2 1
输出:
6
按照我的预期,结果应该是15,但是有错误。
但是如果我用 while(!s.empty())
替换 for (int i = 0; i < s.size(); i++)
,得到正常的结果。
i <size()
有问题吗?如果您能回答,我将不胜感激。
在使用 in loop 之前将堆栈大小存储在另一个变量中,因为当您直接使用 s.size() in loop 时。在每次弹出操作时,每次都会更改堆栈的大小,因此 s.size() 每次都会更改
int size=s.size();
for (int i = 0; i < size; i++)
{
answer = answer + s.top();
s.pop();
}
cout << answer;
for
循环终止条件有问题。
for (int i = 0; i < s.size(); i++)
- 在第一次迭代之前:
i = 0
和 s.size()
是 5
所以 i < s.size()
是 true
- 在第二次迭代之前:
i = 1
和 s.size()
是 4
所以 i < s.size()
是 true
- 在第 3 次迭代之前:
i = 2
和 s.size()
是 3
所以 i < s.size()
是 true
- 在第 4 次迭代之前:
i = 3
和 s.size()
是 2
所以 i < s.size()
是 false
并且第 4 次和第 5 次迭代永远不会发生。
因为在每次迭代中 i
递增而 size()
递减(由于 pop()
操作),这实际上完成了大约一半的必要迭代,结果在 answer = 1 + 2 + 3
中(即 answer = 6
)。
显示了一种修复 for
循环实现的方法,但我更喜欢你问题中的 while(!s.empty())
循环。
我是一名学习基础算法的学生。
我写了一个代码来通过 stl:stack
.
#include <bits/stdc++.h>
using namespace std;
int main(void)
{
ios::sync_with_stdio(0);
cin.tie(0);
int k; cin >> k;
stack<int> s;
int answer=0;
while (k--)
{
int n; cin >> n;
if (n == 0)
{
s.pop();
}
else
{
s.push(n);
}
}
for (int i = 0; i < s.size(); i++)
{
answer = answer + s.top();
s.pop();
}
cout << answer;
}
输入:
5 5 4 3 2 1
输出:
6
按照我的预期,结果应该是15,但是有错误。
但是如果我用 while(!s.empty())
替换 for (int i = 0; i < s.size(); i++)
,得到正常的结果。
i <size()
有问题吗?如果您能回答,我将不胜感激。
在使用 in loop 之前将堆栈大小存储在另一个变量中,因为当您直接使用 s.size() in loop 时。在每次弹出操作时,每次都会更改堆栈的大小,因此 s.size() 每次都会更改
int size=s.size();
for (int i = 0; i < size; i++)
{
answer = answer + s.top();
s.pop();
}
cout << answer;
for
循环终止条件有问题。
for (int i = 0; i < s.size(); i++)
- 在第一次迭代之前:
i = 0
和s.size()
是5
所以i < s.size()
是true
- 在第二次迭代之前:
i = 1
和s.size()
是4
所以i < s.size()
是true
- 在第 3 次迭代之前:
i = 2
和s.size()
是3
所以i < s.size()
是true
- 在第 4 次迭代之前:
i = 3
和s.size()
是2
所以i < s.size()
是false
并且第 4 次和第 5 次迭代永远不会发生。
因为在每次迭代中 i
递增而 size()
递减(由于 pop()
操作),这实际上完成了大约一半的必要迭代,结果在 answer = 1 + 2 + 3
中(即 answer = 6
)。
for
循环实现的方法,但我更喜欢你问题中的 while(!s.empty())
循环。