关于'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 = 0s.size()5 所以 i < s.size()true
  • 在第二次迭代之前:i = 1s.size()4 所以 i < s.size()true
  • 在第 3 次迭代之前:i = 2s.size()3 所以 i < s.size()true
  • 在第 4 次迭代之前:i = 3s.size()2 所以 i < s.size()false 并且第 4 次和第 5 次迭代永远不会发生。

因为在每次迭代中 i 递增而 size() 递减(由于 pop() 操作),这实际上完成了大约一半的必要迭代,结果在 answer = 1 + 2 + 3 中(即 answer = 6)。

显示了一种修复 for 循环实现的方法,但我更喜欢你问题中的 while(!s.empty()) 循环。