Postfix Notation,找到错误//

时间:2017-12-21 09:41:55

标签: c++ postfix

使用C ++ //

的首选语言

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

我以某种方式使用了deque,而不是堆栈,因为我尝试使用堆栈并且它似乎不起作用。但有错误。

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库。

1 个答案:

答案 0 :(得分:1)

您正在使用std :: deque&lt;&gt; :: 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