#include<stdio.h>
typedef struct {
char data[10];
int top;
}Stack;
void InitStack (Stack &s)
{
s.top=0;
}
void Push (Stack &s,char x)
{
if (s.top>10)
printf ("栈满\n");
else
{
s.top++;
s.data[s.top]=x;
}
}
void Pop(Stack &s,char x)
{
x=s.data[s.top];
s.top--;
}
int gettop (Stack &s)
{
return s.data[s.top];
}
int input (char ch)
{
if (ch>'0' && ch<'9')
return 1;
else
return 0;
}
int precede (char a,char b)
{
if (a=='-')
{
if ((a=='-' && b=='+') || (a=='-' && b=='-') || (a=='-' && b==')') || (a=='-' && b=='#'))
return '>';
else
return '<';
}
else if (a=='+')
{
if ((a=='+' && b=='+') || (a=='+' && b=='-') || (a=='+' && b==')') || (a=='+' && b=='#'))
return '>';
else return '<';
}
else if (a=='*')
{
if ((a=='*' && b=='+') || (a=='*' && b=='-') || (a=='*' && b=='*') || (a=='*' && b=='/') || (a=='*' && b==')') || (a=='*' && b=='#'))
return '>';
else
return '<';
}
else if (a=='/')
{
if ((a=='/' && b=='+') || (a=='/' && b=='-') || (a=='/' && b=='*') || (a=='/' && b=='/') || (a=='/' && b==')') || (a=='/' && b=='#'))
return '>';
else
return '<';
}
else if (a=='(')
{
if (a=='(' && b==')')
return '=';
else
return '<';
}
else if (a==')')
return '>';
else if (a=='#')
{
if (a=='#' && b=='#')
return '=';
else
return '<';
}
}
int operate (int a,char t,int b)
{
if (t=='+')
return a+b;
else if (t=='-')
return a-b;
else if (t=='*')
return a*b;
else
return a/b;
}
int main ()
{
char ch,t;
int s,a,b,x;
Stack op1,op2;
InitStack (op1);
InitStack (op2);
Push (op2,'#');
ch=getchar();
while (ch!='#' || gettop(op2)!='#')
{
s=0;
if (!input(ch))
{
while (!input(ch))
s=s*10+ch-'0';
Push (op1,s+48);
ch=getchar();
}
else
switch (precede(gettop(op2),ch))
{
case '<':{
Push (op2,ch);
ch=getchar();
break;
}
case '=':
{
Pop (op2,x);
ch=getchar();
break;
}
case '>':
{
Pop(op2,t);
Pop(op1,b); Pop(op1,a);
Push (op1,operate(a,t,b));
break;
}
}
}
printf ("%d\n",gettop (op1));
return 0;
}
栈实现表达式求值
最新推荐文章于 2022-07-02 12:03:53 发布