假设我们有反向抛光符号,并且我们必须评估该值。反向波兰语符号也称为后缀表达式。在这里,我们必须使用堆栈数据结构来解决后缀表达式。
从后缀表达式中,找到一些操作数后,将它们压入堆栈。找到某个运算符后,将从堆栈中弹出两个项目,然后按正确的顺序执行操作。之后,结果也被压入堆栈中以备将来使用。完成整个表达式后,最终结果也将存储在堆栈顶部。因此,如果表达式为“ 53 + 62 / * 35 * +”,则答案将为39
让我们看看步骤-
对于后缀表达式中的每个字符ch,请执行
将ch添加到堆栈中
:=从堆栈中弹出第一个元素,
b:=从堆栈中弹出第二个元素
res:= b☉a
将res推入堆栈
如果ch是运算符☉,则
否则,如果ch是操作数,则
堆栈顶部的返回元素
让我们看下面的实现以更好地理解-
#include<iostream> #include<cmath> #include<stack> #include<climits> using namespace std; float scanNum(char ch){ int value; value = ch; return float(value-'0');//return float from character } int isOperator(char ch){ if(ch == '+'|| ch == '-'|| ch == '*'|| ch == '/' || ch == '^') return 1;//character is an operator return -1;//not an operator } int isOperand(char ch){ if(ch >= '0' && ch <= '9') return 1;//character is an operand return -1;//not an operand } float operation(int a, int b, char op){ //Perform operation if(op == '+') return b+a; else if(op == '-') return b-a; else if(op == '*') return b*a; else if(op == '/') return b/a; else if(op == '^') return pow(b,a); //find b^a else return INT_MIN; //return negative infinity } float postfixEval(string postfix){ int a, b; stack<float> stk; string::iterator it; for(it=postfix.begin(); it!=postfix.end(); it++){ //read elements and perform postfix evaluation if(isOperator(*it) != -1){ a = stk.top(); stk.pop(); b = stk.top(); stk.pop(); stk.push(operation(a, b, *it)); } else if(isOperand(*it) > 0){ stk.push(scanNum(*it)); } } return stk.top(); } main(){ string post = "53+62/*35*+"; cout << "The result is: "<<postfixEval(post); }
"53+62/*35*+"
输出结果
The result is: 39