Postfix Notation,找到错误//

问题描述 投票:-1回答:1

使用C ++的首选语言//

基本上下面的表达式已经转换为C ++后缀表达式。现在我需要估计结果。

我以某种方式使用deque,而不是堆栈,因为我尝试使用堆栈,它似乎没有工作。但是有bug。

7 8 9 + 1 7 - *

-102

这是我的代码:

string line; inf >> line;

deque <int> stack;

for(int i = 0; i < line.length(); i+=2){

    if(line.at(i) == '*'){
        stack.push_back(stack.pop_back() * stack.pop_back());
    }

    else if(line.at(i) == '+'){
        stack.push_back(stack.pop_back() + stack.pop_back());
    }

    else if(line.at(i) == '-'){
        stack.push_back(-stack.pop_back() + stack.pop_back());
    }

    else stack.push_back(line.at(i)- '0');

}

outf << stack.pop_back() << endl;

return 0;

使用上面的代码,我可以通过一个小的调整进行更改,并将其更改为前缀表示法。

我仍然更喜欢使用C ++中的std :: deque STL库。

c++ postfix
1个回答
1
投票

你正在使用std :: deque <> :: pop_back()错误。它只是从双端队列中删除了最后一个元素并且没有返回任何内容,因此所有stack.pop_back() + stack.pop_back()等都不会编译。相反,对于每个stack.pop_back(),你将不得不做一个operand = stack.back(); mydeque.pop_back();。你可以将它包装在一个小函数中:

int pop_stack( std::deque<int>& _stack )
{
    int result = _stack.back();
    _stack.pop_back();
    return result;
}

然后用这个函数替换你所有的stack.pop_back()pop_stack(stack)

由于std::stack的行为几乎相同(除了方法命名),因此没有理由使用std::deque,你也可以使用堆栈。

std::deque::pop_back()

std::stack::pop()

此外,似乎只有一个操作数太多:7 8 9 + 1 7 - *正确评估-102 - 并且在堆栈中丢失了7

操作数评估:

7 8 9 +

7 17

7 17 1 7 -

7 17 -6

7 17 -6 *

最后:

7 -102

© www.soinside.com 2019 - 2024. All rights reserved.