问题描绘
输入一个只包括加减乘除和括号的合法表达式,求表达式的值。其间除标明整除。
输入格局
输入一行,包括一个表达式。
输出格局
输出这个表达式的值。
样例输入
1-2+3*(4-5)
样例输出
-4
数据规划和约好
表达式长度不跨越100,表达式运算合法且运算进程都在int内进行。
代码如下:
#include
#include
#include
#include
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;
//界说用于寄存数字的栈
stackshu;
char c;
char ss[2]="#";
//界说用于寄存符号的栈
stackfu;
fu.push('#');
gets(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;
}
}
}
printf("%d",shu.top());
return 0;
}