Как извлечь все значения из стека и сдвинуть их обратно как сумму всех значений? - PullRequest
1 голос
/ 16 февраля 2012

Приветствие 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 ]

2 голосов
/ 16 февраля 2012

Нет причин возвращать промежуточную сумму обратно в стек. Просто сохраните сумму в локальном формате и вытолкните значения из стека по одному :

void MathStack::addAll()
{
    int num = 0, sum = 0;

    while(!isEmpty())
    {
        pop(num);
        sum += num;
    }

    push(sum);
}
0 голосов
/ 16 февраля 2012

Проблема в том, что вы хотите разорвать ваш цикл, когда в стеке есть один элемент.

Представьте, что вы начинаете со стека из трех элементов:

4
8
2

Вы запускаете свой цикл, хлопаете 4 и 8, нажимаете 12. Теперь у вас есть:

12
2

Вы снова запускаете свой цикл, хлопаете 12 и 2, нажимаете 14. Теперь у вас есть:

14

Стек не пуст, так что вы попадаете дважды ...

Вы хотите позвонить isEmpty() сразу после first pop (вдополнение к вызову у вас в состоянии цикла).Если он говорит, что стек пуст, общая сумма всего стека равна значению в num.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...