Greetings Stack Overflow社区。我正在尝试创建一个可以弹出堆栈中的所有值的函数,添加它们然后再推回它们。到目前为止,我已成功地添加,减去,除以和乘以两个值,只需将它们弹出两次到局部变量,执行操作然后推回完成的值。但要添加所有我需要从堆栈弹出直到它为空。
我尝试添加一个循环来弹出两个值并推回结果。这就是我的想法
push these numbers 1 , 2 , 3, 4 ,5
pop 5
pop 4
add 5 + 4 = 9
push 9
stack (1,2,3,4,9)
pop 9
pop 4
add 9+4 = 13
push 13
等等。我已经尝试将isEmpty函数用于循环并尝试使其在其中一个值不为NULL时停止。但我不知道如何停止或启动循环,所以它一直持续到空。这是我写的。
void MathStack::addAll()
{
int num = 0,num2 = 0, sum = 0;
while(!isEmpty())
{
//Pop the first two values off the stack.
pop(num);
cout << "Popping " << num << "\n";
pop(num2);
cout << "Popping " << num2 << "\n";
//Add the two values, store in sum.
sum = num + num2;
cout << "Sum is " << sum;
//Push sum back onto the stack.
push(sum);
num =0;
num2 = 0;
}
}
有什么建议吗?
答案 0 :(得分:2)
没有理由将中间总和推回堆栈。只需将总和保存在本地,然后一次一个地从堆栈中弹出值:
void MathStack::addAll()
{
int num = 0, sum = 0;
while(!isEmpty())
{
pop(num);
sum += num;
}
push(sum);
}
答案 1 :(得分:0)
问题是,当堆栈上有一个项目时,你想要打破你的循环。
想象一下,你从一个三项目堆栈开始:
4
8
2
你运行循环,弹出4和8,按12.现在你有:
12
2
你再次运行循环,弹出12和2,按14.现在你有:
14
堆栈不是空的,所以你去弹出两次......
您希望在第一个 isEmpty()
之后立即致电pop
(除了您在循环条件中进行的通话)。如果它告诉您堆栈为空,则整个堆栈的总和是num
中的值。