
#include
#define MAXSIZE 16
typedef struct{
int data[MAXSIZE];
int top;
int base;
}seqstack;
void InitStack(seqstack *s);
int Empty(seqstack *s);
void Push(seqstack *s, int x );
int Pop(seqstack *s);
int GetTop(seqstack *s);
int Operate(int a,char r,int b);
char Proceed(char op ,char c);
int In(char );
int EvalExpres(void);
seqstack StackR,StackD;
int main()
{
int v;
char ch;
v = EvalExpres();
printf("The result is:%d",v);
getch();
}
void InitStack(seqstack *s)
{ s->top = 0;
s->base = 0;
}
int Empty(seqstack *s)
{ if(s->top == s->base)
return 1;
else
return 0;
}
void Push(seqstack *s, int x)
{
if(s->top == MAXSIZE)
{ printf("OVER FLOW!\n");
exit(0);
}
else
{ s->data[s->top] = x;
s->top++;
}
}
int Pop(seqstack *s)
{ int e;
if(Empty(s))
{ printf("Under flow!\n");
return 0;
}
else
{ s->top--;
e = s->data[s->top];
return e;
}
}
int GetTop(seqstack *s)
{
if(Empty(s))
{ printf("Under flow!\n");
return 0;
}
else
return s->data[s->top-1];
}
int EvalExpres(void)
{
int a,b,i=0,s=0;
char c,r;
InitStack(&StackR);
Push(&StackR,'#');
InitStack(&StackD);
printf("Please enter a expression end with '#': ");
gets(c);
while(c[i]!='#' || GetTop(&StackR)!='#')
{
if(!In(c[i]))
{ if(c[i] >= '0' && c[i] <= '9')
{
s += c[i]-'0';
while(!In(c[++i]))
{ s*=10;
s += c[i]-'0';
}
Push(&StackD,s+'0');
s = 0;
}
}
else
switch(Proceed(GetTop(&StackR),c[i]))
{
case '<':
Push(&StackR,c[i]);
i++;
break;
case '=':
Pop(&StackR);
i++;
break;
case '>':
r = Pop(&StackR);
a = Pop(&StackD)-'0';
b = Pop(&StackD)-'0';
Push(&StackD,Operate(a,r,b)) ;
break;
}
}
return (GetTop(&StackD)-'0');
}
int In(char c)
{
char ch={'+','-','*','/','%','#','(',')'};
int i;
for(i = 0; i < 8; i++)
if(c == ch[i])
return 1;
return 0;
}
char Proceed(char op,char c)
{
char ch;
if(op=='(' && c==')' || op=='#' && c=='#' )
ch = '=';
else
if(op=='+' || op=='-')
switch(c)
{
case '+':
case '-':
case ')':
case '#': ch = '>'; break;
case '*':
case '/':
case '%':
case '(': ch = '<';
}
else
if(op=='*' || op=='/'|| op=='%')
switch(c)
{
case '+':
case '-':
case '*':
case '/':
case '%':
case ')':
case '#': ch = '>'; break;
case '(': ch = '<';
}
else
if(op=='(')
switch(c)
{
case '+':
case '-':
case '*':
case '/':
case '%':
case '(': ch = '<'; break;
case '#': printf("Error!\n"); exit(0);
}
else
if(op==')')
switch(c)
{
case '+':
case '-':
case '*':
case '/':
case '%':
case '#': ch = '>'; break;
case '(': printf("Error!\n"); exit(0);
}
else
if(op=='#')
switch(c)
{
case '+':
case '-':
case '*':
case '/':
case '%':
case '(': ch = '<'; break;
case ')': printf("Error!\n"); exit(0);
}
return ch;
}
int Operate(int a,char r,int b)
{
int s;
int d1 = a;
int d2 = b;
switch(r)
{
case '+': s = d1+d2; break;
case '-': s = d2-d1; break;
case '*': s = d1*d2; break;
case '/': s = d2/d1; break;
case '%': s = d2%d1; break;
}
return (s+'0');
}
那ACM小组内部预定函数里面有的是,你自己去下载下来看吧。
