/*实现功能`计算算术表达式的值*/
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#define MAXSIZE 100
typedef char Elemtype;
typedef struct SqStack SqStack;
struct SqStack
{
int elem[MAXSIZE];
int top;
};
void InitStack(SqStack *s)
{
s->top=0;
}
void Push(SqStack *s,Elemtype x)
{
if(s->top==MAXSIZE-1)
printf("栈已满\n");
else
{
s->top++;
s->elem[s->top-1]=x;
}
}
int Pop(SqStack *s,Elemtype *y)
{
if(s->top==0)
return 0;
s->top--;
*y=s->elem[s->top];
return 1;
}
int Get_StackTop(SqStack *s)
{
Elemtype x;
if(s->top!=0)
{
x=s->elem[s->top];
return x;
}
else
{
printf("Eorror\n");
return 0;
}
}
int Opr(char c)
{
if(c=='+'||c=='-'||c=='*'||c=='/'||c=='('||c==')'||c=='=')
return 0;
else
return 1;
}
char precede(char s,char c)
{
switch(s)
{
case'+':
case'-':
if(c=='+'||c=='-')
return '>';
else if(c=='*'||c=='/')
return '<';
else if(c=='(')
return '<';
else if(c==')')
return '>';
else
return '>';
case'*':
case'/':
if(c=='+'||c=='-')
return '>';
else if(c=='*'||c=='/')
return '>';
else if(c=='(')
return '<';
else if(c==')')
return '>';
else
return '>';
case '(':
if(c=='+'||c=='-')
return '<';
else if(c=='*'||c=='/')
return '<';
else if(c=='(')
return '<';
else if(c==')')
return '=';
else
return 'E';
case ')':
if(c=='+'||c=='-')
return '>';
else if(c=='*'||c=='/')
return '>';
else if(c=='(')
return 'E';
else if(c==')')
return '>';
else
return '>';
case '#':
if(c=='+'||c=='-')
return '<';
else if(c=='*'||c=='/')
return '<';
else if(c=='(')
return '<';
else if(c==')')
return 'E';
else
return '=';
default:
break;
}//switch
return 0;
}//preceed
int Operation(char *m,char *op,char *n)
{
int num;
int a=atoi(m);
int b=atoi(n);
switch(*op)
{
case'+':
num=a+b;
break;
case'-':
num=a-b;
break;
case'*':
num=a*b;
break;
case'/':
if(b==0)
{
printf("Eorror\n");
return 0;
}
else
{
num= a/b;
break;
}
default:
printf("In put eorror \n");
break;
}//switch
return num;
}//operation
void main()
{
char c,r;
char *x,*op;
char *a,*b;
int value;
SqStack *OPTR; //算符
SqStack *OPND; //运算数
OPTR=(SqStack *)malloc(sizeof(SqStack));
OPND=(SqStack *)malloc(sizeof(SqStack));
InitStack(OPTR);
Push(OPTR,'#');
InitStack(OPND);
c=getchar();
while(c!='#'||Get_StackTop(OPTR)!='#')
{
if(!Opr(c))
{
Push(OPND,c);
c=getchar();
}
else
{
r=precede(Get_StackTop(OPTR),c);
switch(r)
{
case'<':
Push(OPND,c);
c=getchar();
break;
case'=':
Pop(OPTR,x);
c=getchar();
case'>':
Pop(OPTR,op);
Pop(OPND,a);
Pop(OPND,b);
value=Operation(b,op,a);
Push(OPND,value);
break;
}//switch
}//else
}//wilte
printf("result = %d\n",Get_StackTop(OPND));
}