如何从堆栈中弹出所有值并将它们作为所有值的总和推回?

时间:2012-02-16 15:40:52

标签: c++ stack

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;
    }


}

有什么建议吗?

2 个答案:

答案 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中的值。