使用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库。
答案 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
,您也可以使用堆栈。
此外,似乎只有一个操作数太多:
7 8 9 + 1 7 - *
正确评估到-102
- 并且堆栈中丢失了7
。
操作数评估:
7 8 9 +
7 17
7 17 1 7 -
7 17 -6
7 17 -6 *
决赛:
7 -102