C++使用STL stack求和时for循环以s.size()为判断条件结果异常问题
问题原因分析
你写的for (int i = 0; i < s.size(); i++)逻辑的问题在于循环判断条件里的s.size()是动态变化的,每次循环执行s.pop()操作后,栈的大小都会减1,而循环变量i每次会加1,两者相向变化会导致循环提前终止,无法遍历栈中所有元素。
测试用例执行过程拆解
你输入5 5 4 3 2 1后,栈内最终会存入5个元素(从栈底到栈顶依次是5、4、3、2、1),初始s.size()为5,for循环实际执行过程如下:
- 第1次循环:i=0,s.size()=5,条件成立。累加栈顶值1,answer=1,执行pop后s.size()变为4,i自增为1
- 第2次循环:i=1,s.size()=4,条件成立。累加栈顶值2,answer=3,执行pop后s.size()变为3,i自增为2
- 第3次循环:i=2,s.size()=3,条件成立。累加栈顶值3,answer=6,执行pop后s.size()变为2,i自增为3
- 第4次判断:i=3,s.size()=2,3<2不成立,循环终止
最终只累加了3个元素,得到结果6,和你的实际输出一致。
正确写法说明
- 你换成
while(!s.empty())是完全正确的:该判断只关注栈是否为空,只要栈内还有元素就继续执行,直到所有元素都被弹出累加,自然能得到正确结果。 - 如果你想继续用for循环实现,可以先把栈的初始大小存为固定值,避免动态变化影响判断:
int len = s.size(); for (int i = 0; i < len; i++) { answer += s.top(); s.pop(); }
内容的提问来源于stack exchange,提问作者zeon1123
相关产品推荐
相关产品推荐

