我们先看个例子:
1.比较运算符号的优先级 *||/>+||- , * > -,先算 7*2; 将结果保存在 7的位置;
2.最后进行减号。
题目:
描述
计算表达式的值。
输入
输入文件第一行为测试用例的个数N(1<=N<=100),接下N行,每行为一个表达式,表达式除了数值外,只包含“+”、“-”、 “*”、“/”,分别表示加减乘除运算。对除法运算,结果假定不出现小数。同时也可以假定表达式中间及最后结果不大于9999999
输出
对每一个表达式,用一行输出其值。
样例输入
4
2+5
4+2*3-10/5
3*7-2
1+2+3+4
样例输出
7
8
19
10
ACcode:
#include <iostream> #include <string> using namespace std; //构造两个栈,一个数字栈,另一个符号栈 typedef struct { double *data; int top; }Stack1; typedef struct { char *c; int top; }Stack2; //初始化 void Init_1(Stack1 &S,int len) { S.data=new double [len+1]; S.top=0; } void Init_2(Stack2 &S,int len) { S.c=new char[len+1]; S.top=0; } //入栈 void push_1(Stack1 &S,int n) { S.data[S.top++]=n; } void push_2(Stack2 &S,char ch) { S.c[S.top++]=ch; } //运算符号比较 int compare(char c1,char c2) { //有4种情况 // 1. c1为+.-||c2为+.- // 2. c1为+、-||c2为 *./ // 3. c1为 * ./ || c2 为 +.- // 4. c1为 * ,/ || c2 为* , / //其中 1,3,4 是一次按顺序计算,2要先计算后面的 if((c1=='+'||c1=='-')&&(c2=='*'||c2=='/')) return 1; else return 0; } double jisuan(double c1,double c2,char c) { if(c=='+') return c1+c2; else if(c=='-') return c1-c2; else if(c=='*') return c1*c2; else if(c=='/') return c1/c2; } void qiuzhi(Stack1 S1,Stack2 S2) { int i,j=0; double e; for(i=0;i<S2.top-1;i++) { if(compare(S2.c[i],S2.c[i+1]))//判断优先级 { //i+1的优先级大于i的优先级 e=jisuan(S1.data[j+1],S1.data[j+2],S2.c[i+1]);//计算结果 S1.data[j+2]=e; //所得之放入j+2中 S1.data[j+1]=S1.data[j];//将下面的数字往上移一位 S2.c[i+1]=S2.c[i];//符号也往上移一位 j++; } else { e=jisuan(S1.data[j],S1.data[j+1],S2.c[i]); S1.data[j+1]=e; j++; } } cout<<jisuan(S1.data[j],S1.data[j+1],S2.c[i])<<endl; } int main() { Stack1 S1; Stack2 S2; int n,i,k,len; string str; // freopen("1.txt","r",stdin); cin>>n; while(n--) { cin>>str; len=str.length(); Init_1(S1,len); Init_2(S2,len); int t=0; k=0; //将数字放入数字栈,将运算符放入符号栈 for(i=0;i<len;i++) { if(str[i]>='0' && str[i]<='9') k=k*10+str[i]-'0'; else { push_1(S1,k); k=0; if(str[i]=='+'||str[i]=='-'||str[i]=='/'||str[i]=='*') push_2(S2,str[i]); } if(i==len-1) push_1(S1,k); } qiuzhi(S1,S2); } return 0; }