测评会员优惠活动进行中 · 开通 VIP,有效期内测评不限次 VIP 优惠中 · 测评不限次 立即查看

A46328. 中缀表达式的值

填空题 困难

题目描述

中缀表达式的值

题目描述

人们熟悉的四则运算表达式称为中缀表达式,例如(23+34*45/(5+6+7))。在程序设计语言中,可以利用堆栈的方法把中缀表达式转换成保值的后缀表达式(又称逆波兰表示法),并最终变为计算机可以直接执行的指令,得到表达式的值。 给定一个中缀表达式,编写程序,利用堆栈的方法,计算表达式的值。

输入

第一行为测试数据的组数N 接下来的N行,每行是一个中缀表达式。表达式中只含数字、四则运算符和圆括号,操作数都是正整数,数和运算符、括号之间没有空格。中缀表达式的字符串长度不超过600。

输出

对每一组测试数据输出一行,为表达式的值

样例输入

3

3+5*8

(3+5)*8

(23+34*45/(5+6+7))

样例输出

43

64

108

提示

注意:运算过程均为整数运算(除法运算'/'即按照C++定义的int除以int的结果,测试数据不会出现除数为0的情况),输出结果也为整数(可能为负)。 中间计算结果可能为负。

参考答案

#include<iostream> #include<string> #include<stack> #include<cstdlib> #include<sstream> #include<vector> using namespace std; int string_to_int(string a){ stringstream ss; int s; ss<<a; ss>>s; return s; } int judge(string a){ if(a=="+"||a=="-") return 1; else if(a=="*"||a=="/") return 2; else if(a=="(") return 3; else if(a==")") return -1; else return 0; } vector<string> chu_shi_hua(string s){//初始化 vector<string>a; int j,i; i=0; while(i<s.size()) { j=i; while(j<s.size()&&s.at(j)<='9'&&s.at(j)>='0'){ j++; } if(i==j){ a.push_back(s.substr(i,1)); i=i+1; } else{ a.push_back(s.substr(i,j-i)); i=j; } } return a; } int calculate(vector<string> s){ stack<int> result; int a,b; for(int i=0; i<s.size();i++){ if(judge(s[i])==0) result.push(string_to_int(s[i])); else{ a=result.top(); result.pop(); b=result.top(); result.pop(); if(s[i]=="+") result.push(b+a); if(s[i]=="-") result.push(b-a); if(s[i]=="*") result.push(a*b); if(s[i]=="/") result.push(b/a); } } return result.top(); } vector<string> zhong_hou(vector<string> s){ stack<string> result; vector<string> save; for(int i=0; i<s.size();i++){ if(judge(s[i])==0)//遇到数字就直接输出 save.push_back(s[i]); if(judge(s[i])>0){ if(result.empty())//栈为空则直接压栈 result.push(s[i]); else{ if(judge(s[i])>judge(result.top()))//操作符优先级比栈顶操作符优先级高 { result.push(s[i]); } else{ while((!result.empty())&&judge(result.top())>=judge(s[i])&&result.top()!="(")//弹栈并输出直到栈为空或遇到优先级更低的操作符 (除了左括号) { save.push_back(result.top()); result.pop(); } result.push(s[i]); } } } if(judge(s[i])==-1){ while(result.top()!="("){ save.push_back(result.top()); result.pop(); } result.pop(); } } while(!result.empty()){ save.push_back(result.top()); result.pop(); } return save; } int main(){ int n; string s1;//s1表达式 vector<string> s2,s3;//s2是初始化后的表达式,将多位的数字分出来。s3是后缀表达式 cin>>n; while(n--){ cin>>s1; s2=chu_shi_hua(s1); s3=zhong_hou(s2); cout<<calculate(s3)<<endl; } return 0; }
上一题 下一题