表达式计算模板

 下面是我的模板,显得比较的长,要多加努力了~~写出更好的程序

1、前缀式模板

题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=128

#include<iostream> #include<cstring> #include<sstream> #include<string> #include<cstdio> using namespace std; char s[505]; double exc(istringstream &iss) { char a[10]; double res; iss>>a; switch(a[0]) { case '+':return exc(iss)+exc(iss);break; case '-':return exc(iss)-exc(iss);break; case '*':return exc(iss)*exc(iss);break; case '/':return exc(iss)/exc(iss);break; default :sscanf(a,"%lf",&res); return res; } } int main() { double result; while(gets(s)) { istringstream iss(s); result=exc(iss); cout.precision(2); cout<<fixed<<result<<endl; } return 0; }  

2.中缀表达式求值(转化为后缀式)

分析:中缀表达式转后缀表达式的方法:
1. 读到运算数时,直接输出。
2. 读到"("时,压栈。
3. 读到"+ - * /"时,弹出栈元素直到优先级更低的元素为止,该符号压栈。
   (如栈有"+*",读到"+",弹出"*+",再"+"压栈)
4. 读到")"时,出栈直到"("
5. 最后全部出栈。
要注意的就是要把'('的优先度设为最低。

题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=35,nyist 267

#include<iostream> #include<cstring> #include<stack> #include<cmath> #include<cstdio> #include<algorithm> using namespace std; stack<char> optr; string s,s1,s2; int comp(char a) { if(a=='(') return 0;//一定要加这个语句 if(a=='+'||a=='-') return 1; if(a=='*'||a=='/') return 2; } double change(string s) { stack<double> v; int i; for(int i=0;i<s.length();i++) { if(s[i]>='0') { double sum=0,sum1=0; while(i<s.length()&&s[i]!=' '&&s[i]!='.') sum=10*sum+int(s[i++]-'0'); int num=0; if(s[i]=='.') { i++; while(i<s.length()&&s[i]!=' ') { sum1=10*sum1+int(s[i++]-'0'); num++; } } v.push(sum+sum1/pow(10.0,double(num))); } else if(s[i]!=' ') { double a,b,c; a=v.top();v.pop(); b=v.top();v.pop(); switch(s[i]) { case '+': c=a+b; v.push(c);break; case '-': c=b-a; v.push(c);break; case '*': c=a*b; v.push(c);break; case '/': c=b/a; v.push(c);break; } } } return v.top(); } int main() { int k,i; char c; double sum; cin>>k; getchar(); while(k--) { cin>>s; s1="";//后缀表达式含空格 s2=""; for(i=0;i<s.length()-1;i++) { if(s[i]>='0') { while((s[i]>='0'||s[i]=='.')&&i<s.length()-1) s1+=s[i++]; s1+=' '; i--; } if(s[i]=='(') optr.push(s[i]); if(s[i]==')') { while(!optr.empty()&&optr.top()!='(') { s1+=optr.top(); s1+=' '; optr.pop(); } optr.pop(); } if(s[i]=='+'||s[i]=='-'||s[i]=='*'||s[i]=='/') { while(!optr.empty()&&(comp(optr.top())>=comp(s[i]))) { s1+=optr.top(); s1+=' '; optr.pop(); } optr.push(s[i]); } } while(!optr.empty()) { s1+=optr.top(); s1+=' '; optr.pop(); } s1+='='; string::iterator it=s1.end(); s1.erase(it-2,it); sum=change(s1); cout.precision(2); cout<<fixed<<sum<<endl; } return 0; }  

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(表达式计算模板)