题目地址:http://ac.jobdu.com/problem.php?cid=1040&pid=28
C语言源码:
//这个题不是跟第27题一模一样嘛
#include<stdio.h>
#include<string.h>
int Precede(char a,char b)
{
int p[5][5]={{-1,-1,-1,-1,1},{-1,-1,-1,-1,1},{1,1,-1,-1,1},{1,1,-1,-1,1},{-1,-1,-1,-1,0}};
//+,-,*,、,#
int m,n;
switch(a)
{
case '+':m=0;break;
case '-':m=1;break;
case '*':m=2;break;
case '/':m=3;break;
case '#':m=4;break;
}
switch(b)
{
case '+':n=0;break;
case '-':n=1;break;
case '*':n=2;break;
case '/':n=3;break;
case '#':n=4;break;
}
return p[m][n];
}
int operate(int a,int b,char s)
{
switch(s)
{
case '+':return a+b;break;
case '-':return a-b;break;
case '*':return a*b;break;
case '/':return a/b;break;
}
}
int main()
{
char s[10005],optr[10005],tr;
int opnd[10005],toptr,topnd,i,len,x,y,z;
//optr是运算符栈,opnd是运算数栈
while(scanf("%s",s)!=EOF)
{
toptr=0;
topnd=0;
optr[toptr++]='#';
len=(int)strlen(s);
s[len]='#';
s[len+1]='\0';
len++;
x=0;
for(i=0;i<len;i++)
{
if(s[i]>='0'&&s[i]<='9')
x=x*10+s[i]-'0';
else
{
if(x)
{
opnd[topnd++]=x;
x=0;
}
while(Precede(s[i],optr[toptr-1])<0)
{
z=opnd[--topnd];
y=opnd[--topnd];
tr=optr[--toptr];
opnd[topnd++]=operate(y,z,tr);
}
if(i!=len-1)
optr[toptr++]=s[i];
}
}
printf("%d\n",opnd[topnd-1]);
}
}