#include<stdio.h>
#include<malloc.h>
#define STACK_INIT_SIZE 10
#define STACKINCREMENT 10
char op[7]={'+','-','*','/','(',')','\n'};
typedef struct
{
int *base;
int *top;
int stacksize;
}SqStack;
void InitStack(SqStack *s)
{
s->base=(int *)malloc(STACK_INIT_SIZE*sizeof(int));
s->top=s->base;
s->stacksize=STACK_INIT_SIZE;
}
char GetTop(SqStack *s) //返回线顶元素
{
if(s->top==s->base)
{
printf("栈为空!");
return 0;
}
return *(s->top-1);
}
void Push(SqStack *s,int e)
{
if(s->top-s->base>=s->stacksize)
{
s->base=(int *)realloc(s->base,(s->stacksize+STACKINCREMENT)*sizeof(int));
s->top=s->base+s->stacksize;
s->stacksize+=STACKINCREMENT;
}
*(s->top)=e;
s->top++;
}
void Pop(SqStack *s,int *e)
{
if(s->top==s->base)
{
printf("栈为空!");
return;
}
s->top--;
*e=*(s->top);
}
int In(char c)//判断是否是运算符,如果是反回1,不是则返回0;
{
int i;
for(i=0;i<8;i++)
{
if(c==op[i])
return 1;
}
return 0;
}
char Precede(char charGetTop,char c)//判断运算符的优先级
{
switch (charGetTop)
{
case '+':
switch (c)
{
case '+':
return '>';
case '-':
return '>';
case '*':
return '<';
case '/':
return '<';
case '(':
return '<';
case ')':
return '>';
case '\n':
return '>';
}
break;
case '-':
switch (c)
{
case '+':
return '>';
case '-':
return '>';
case '*':
return '<';
case '/':
return '<';
case '(':
return '<';
case ')':
return '>';
case '\n':
return '>';
}
break;
case '*':
switch (c)
{
case '+':
return '>';
case '-':
return '>';
case '*':
return '>';
case '/':
return '>';
case '(':
return '<';
case ')':
return '>';
case '\n':
return '>';
}
break;
case '/':
switch (c)
{
case '+':
return '>';
case '-':
return '>';
case '*':
return '>';
case '/':
return '>';
case '(':
return '<';
case ')':
return '>';
case '\n':
return '>';
}
break;
case '(':
switch (c)
{
case '+':
return '<';
case '-':
return '<';
case '*':
return '<';
case '/':
return '<';
case '(':
return '<';
case ')':
return '=';
}
break;
case ')':
switch (c)
{
case '+':
return '>';
case '-':
return '>';
case '*':
return '>';
case '/':
return '>';
case ')':
return '>';
case '\n':
return '>';
}
break;
case '\n':
switch (c)
{
case '+':
return '<';
case '-':
return '<';
case '*':
return '<';
case '/':
return '<';
case '(':
return '<';
case '\n':
return '=';
}
break;
}
}
int Operate(int a,char theta,int b)
{
switch(theta)
{
case '+':
return (a+b);
case '-':
return (a-b);
case '*':
return (a*b);
case '/':
return (a/b);
}
}
void main()
{
SqStack optr,opnd;
char c;
InitStack(&optr);
Push(&optr,'\n');//初始化运算符栈
InitStack(&opnd);
c=getchar();
while(GetTop(&optr)!='\n'||c!='\n')
{
char x,theta;
int a,b;
if(!In(c))
{
Push(&opnd,(c-'0'));
c=getchar();
}
else
{
switch(Precede(GetTop(&optr),c))
{
case '<':
Push(&optr,c);
c=getchar();
break;
case '=':
Pop(&optr,&x);
c=getchar();
break;
case '>':
Pop(&optr,&theta);
Pop(&opnd,&b);
Pop(&opnd,&a);
Push(&opnd,Operate(a,theta,b));
break;
}
}
}
printf("%d\n",GetTop(&opnd));
getchar();
}