用栈编个简单计算器。。出问题了
这是我写的,但是输出不来结果,各位大大帮帮忙啊#include <stdio.h>
#include <stdlib.h>
#define MAX 100
typedef struct
{
int a[MAX];
int top;
}OPND;
typedef struct
{
char a[MAX];
int top;
}OPTR;
void Init_OPND(OPND *s);
void Push_OPND(OPND *s,int x);
int Pop_OPND(OPND *s);
int GetTop_OPND(OPND *s);
void Init_OPTR(OPTR *s);
void Push_OPTR(OPTR *s,char x);
char Pop_OPTR(OPTR *s);
char GetTop_OPTR(OPTR *s);
int IsOpr(char c);
char Precede(char s,char c);
int Operate(int x,char opr,int y);
void Init_OPND(OPND *s)
{
s->top =-1;
}
void Init_OPTR(OPTR *s)
{
s->top =-1;
}
void Push_OPND(OPND *s,int x)
{
s->top ++;
s->a [s->top ]=x;
}
void Push_OPTR(OPTR *s,char x)
{
s->top ++;
s->a [s->top ]=x;
}
int Pop_OPND(OPND *s)
{
int x;
x=s->a [s->top];
s->top --;
return x;
}
char Pop_OPTR(OPTR *s)
{
char x;
x=s->a [s->top];
s->top --;
return x;
}
int GetTop_OPND(OPND *s)
{
return (s->a[s->top]);
}
char GetTop_OPTR(OPTR *s)
{
return (s->a[s->top]);
}
int IsOpr(char c)
{
if (c=='+'||c=='-'||c=='*'||c=='/'||c=='('||c==')'||c=='#')
return 1;
else
return 0;
}
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 '>';
}
break;
case '*':
case '/':
{
if(c=='+'||c=='-')
return '>';
else if (c=='*'||c=='/')
return '>';
else if(c=='(')
return '<';
else if(c==')')
return '>';
else
return '>';
}
break;
case '(':
{
if(c==')')
return '=';
else
return '<';
}
break;
case ')':
{
return '>';
}
break;
case '#':
{
if(c=='#')
return '=';
else
return '<';
}
break;
}
}
int Operate(int x,char opr,int y)
{
int result;
switch (opr)
{
case '+':
result = x + y;
break;
case '-':
result = x - y;
break;
case '*':
result = x * y;
break;
case '/':
result = x / y;
break;
}
return result;
}
void main()
{
OPND sdata;
OPTR soper;
int a,b,result;
char ch,theta;
Init_OPND(&sdata);
Init_OPTR(&soper);
Push_OPTR(&soper,'#');
scanf("%c",&ch);
while(ch!='#'||GetTop_OPTR(&soper)!='#');
{
if(!IsOpr(ch))
{
Push_OPND(&sdata,ch);
scanf("%c",&ch);
}
else
{
switch(Precede(GetTop_OPTR(&soper),ch))
{
case '<':
Push_OPTR(&soper,ch);
scanf("%c",&ch);
break;
case '=':
theta=Pop_OPTR(&soper);
scanf("%c",&ch);
break;
case '>':
theta=Pop_OPTR(&soper);
a=Pop_OPND(&sdata);
b=Pop_OPND(&sdata);
result=Operate(a,theta,b);
Push_OPND(&sdata,result);
break;
}
}
}
printf("%d",GetTop_OPND(&sdata));
}