C++ 中求字尾表示式的值
假設我們有一個字尾表示式,我們必須求這個表示式的值。字尾表示式也稱為逆波蘭表示法。這裡,我們必須使用棧資料結構計算字尾表示式。
因此,如果表示式為“21+3*”,那麼答案是 9。
我們來看看步驟 −
- 對於字尾表示式中的每個字元 ch,執行以下操作
- 如果 ch 是一個運算子 $\odot$,那麼
- a := 從棧中彈出第一個元素,
- b := 從棧中彈出第二個元素
- res := b $\odot$ a
- 將 res 壓入棧中
- 如果 ch 是一個運算元,那麼
- 將 ch 新增到棧中
- 如果 ch 是一個運算子 $\odot$,那麼
- 返回棧頂元素
我們來看下面的實現,以更好地理解 −
示例
#include<bits/stdc++.h>
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 = "21+3*";
cout <<postfixEval(post);
}輸入
"21+3*"
輸出
9
廣告
資料結構
網路
RDBMS
作業系統
Java
iOS
HTML
CSS
Android
Python
C 程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP