看了大神的代码后
我们先看个例子:
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;
}