用 C++ 程序评估逆波兰表达式
假设我们有逆波兰表达式,我们必须评估值。逆波兰表达式也称为后缀表达式。这里我们必须使用栈数据结构来求解后缀表达式。
从后缀表达式中,在找到某些运算数时,将它们放入栈中。找到某个运算符时,从栈中弹出两个元素,然后按正确的顺序执行操作。在那之后,结果也会被放入栈中以备将来使用。而在完成整个表达式后,最终结果也会存储在栈顶。因此,如果表达式是“53+62/*35*+”,那么答案将是 39
让我们看步骤 −
- 对于后缀表达式中的每个字符 ch,执行以下操作
- 如果 ch 是运算符 ☉,则
- a := 弹出栈中的第一个元素,
- b := 弹出栈中的第二个元素
- res := b ☉ a
- 将 res 压入栈中
- 否则,如果 ch 是一个运算数,则
- 将 ch 添加到栈中
- 如果 ch 是运算符 ☉,则
- 返回栈顶元素
示例(C++)
让我们看以下实现以获得更好的理解 −
#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
广告
数据结构
网络
RDBMS
操作系统
Java
iOS
HTML
CSS
Android
Python
C 程序设计
C++
C#
MongoDB
MySQL
Javascript
PHP