问题描述
输入一个只包含加减乖除和括号的合法表达式,求表达式的值。其中除表示整除。
输入格式
输入一行,包含一个表达式。
输出格式
输出这个表达式的值。
样例输入
1-2+3*(4-5)
样例输出
-4
数据规模和约定
表达式长度不超过100,表达式运算合法且运算过程都在int内进行。
用到了栈的知识,数字建一个栈,符号建一个栈。然后根据符号先后顺序比较,出栈入栈进行计算。
#include<iostream>
#include<string>
#include<stack>
using namespace std;
char s[110];
char pre[7][7]={
{'>','>','<','<','<','>','>'},
{'>','>','<','<','<','>','>'},
{'>','>','>','>','<','>','>'},
{'>','>','>','>','<','>','>'},
{'<','<','<','<','<','=','0'},
{'>','>','>','>','0','>','>'},
{'<','<','<','<','<','0','='}};
char procede(char a,char b)
{
int i,j;
switch(a)
{
case'+':i=0;break;
case'-':i=1;break;
case'*':i=2;break;
case'/':i=3;break;
case'(':i=4;break;
case')':i=5;break;
case'#':i=6;break;
}
switch(b)
{
case'+':j=0;break;
case'-':j=1;break;
case'*':j=2;break;
case'/':j=3;break;
case'(':j=4;break;
case')':j=5;break;
case'#':j=6;break;
}
return pre[i][j];
}
int operate(int m,int n,char x)
{
if(x=='+')
return m+n;
if(x=='-')
return n-m;
if(x=='*')
return m*n;
if(x=='/')
return n/m;
}
int main()
{
int k,y;
stack <int> shu;
stack <char> fu;
char c;
char ss[2]="#";
fu.push('#');
cin>>s;
strcat(s,ss);
c=s[0];
k=1;
while(c!='#'||fu.top()!='#')
{
y=0;
if(c>='0'&&c<='9')
{
while(c>='0'&&c<='9')
{
y=y*10+(c-'0');
c=s[k++];
}
shu.push(y);
}
else
{
switch(procede(fu.top(),c))
{
case'<':
fu.push(c);
c=s[k++];
break;
case'=':
fu.pop();
c=s[k++];
break;
case'>':
char x=fu.top();fu.pop();
int m=shu.top();shu.pop();
int n=shu.top();shu.pop();
shu.push(operate(m,n,x));
break;
}
}
}
cout<<shu.top();
system("pause");
return 0;
}```
网友评论