#include<stdio.h>
#include<string.h>
#include<stack>
#include<map>
using namespace std;
map<char,int> OP_PRI;
char ep[105];
char he[105];
void init(){
OP_PRI['('] = 9999;
OP_PRI[')'] = -1;
OP_PRI['#'] = 0;
OP_PRI['+'] = 1;
OP_PRI['-'] = 1;
OP_PRI['*'] = 2;
OP_PRI['/'] = 2;
}
void getHz(){
int len = strlen(ep);
stack<char> op;
stack<char> hz;
op.push('#');
for(int i = 0;i < len;i++){
if(ep[i] >= '0' && ep[i] <= '9'){
hz.push(ep[i]);
}else{
if(ep[i] == ')'){
while(op.top() != '('){
hz.push(op.top());
op.pop();
}
op.pop();
continue;
}
while(op.top() != '(' && OP_PRI[ep[i]] < OP_PRI[op.top()]){
hz.push(op.top());
op.pop();
}
op.push(ep[i]);
}
}
stack<char> tmp;
while(!hz.empty()){
tmp.push(hz.top());
hz.pop();
}
int cnt = 0;
while(!tmp.empty()){
he[cnt++] = tmp.top();
tmp.pop();
}
while(!op.empty()){
he[cnt++] = op.top();
op.pop();
}
he[cnt-1] = '\0';
}
int cal(){
stack<int> data;
for(int i = 0;he[i] != '\0';i++){
if(he[i] >= '0' && he[i] <= '9'){
data.push(he[i]-'0');
}else{
int b = data.top();
data.pop();
int a = data.top();
data.pop();
if(he[i] == '+'){
data.push(a+b);
}else if(he[i] == '-'){
data.push(a-b);
}else if(he[i] == '/'){
data.push(a/b);
}else if(he[i] == '*'){
data.push(a*b);
}
}
}
return data.top();
}
int main(){
init();
scanf("%s",ep);
getHz();
printf("%s ---> %s\n",ep,he);
printf("=%d\n",cal());
return 0;
}
c++逆波蘭式計算表達式
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.