用栈实现带括号的四则运算器的简单程序
现在不管输入什么,一回车程序就结束,什么也不输出,请问是怎么回事
#include <stdio.h>
#include <stdlib.h>
#define TRUE 1
#define FALSE 0
#define Stack_Size 50
typedef char StackElementType;
typedef struct
{
StackElementType elem[Stack_Size];
int top;
}SeqStack;
//初始化栈
void InitStack(SeqStack *S)
{
S->top=-1;
}
//进栈
int Push(SeqStack *S,StackElementType x)
{
if(S->top==Stack_Size-1)
return(FALSE);
S->top++;
S->elem[S->top]=x;
return(TRUE);
}
//出栈
int Pop(SeqStack *S,StackElementType *x)
{
if(S->top==-1)
return(FALSE);
else
{
*x=S->elem[S->top];
S->top--;
return(TRUE);
}
}
//读栈顶元素
int GetTop(SeqStack *S,StackElementType *x)
{
if(S->top==-1)
return(FALSE);
else
{
*x=S->elem[S->top];
return(TRUE);
}
}
//优先级比较函数
StackElementType Compare(StackElementType ch,StackElementType ch_temp)
{
char compare[7][7]={
{'<','<','<','<','<','0','>'},
{'<','<','<','<','<','0','>'},
{'>','>','<','<','<','0','>'},
{'>','>','<','<','<','0','>'},
{'>','>','>','>','>','0','>'},
{'<','<','<','<','=','0','0'},
{'<','<','<','<','<','0','0'}
};
int index,index_temp;
switch(ch)
{
case '+':index=0;break;
case '-':index=1;break;
case '*':index=2;break;
case '/':index=3;break;
case '(':index=4;break;
case ')':index=5;break;
case '#':index=6;break;
}
switch(ch_temp)
{
case '+':index_temp=0;break;
case '-':index_temp=1;break;
case '*':index_temp=2;break;
case '/':index_temp=3;break;
case '(':index_temp=4;break;
case ')':index_temp=5;break;
case '#':index_temp=6;break;
}
return(compare[index][index_temp]);
}
//计算函数
int Execute(StackElementType a,StackElementType op,StackElementType b)
{
int a_num,b_num,result_num;
StackElementType result;
a_num=(int)a;
b_num=(int)b;
switch(op)
{
case '+':result_num=a_num+b_num;break;
case '-':result_num=a_num-b_num;break;
case '*':result_num=a_num*b_num;break;
case '/':result_num=a_num/b_num;break;
}
result=(StackElementType)result_num;
return(result);
}
//主函数
int main()
{
SeqStack OVS,OPTR;
InitStack(&OVS);
InitStack(&OPTR);//初始化
char ch,ch_temp,op,a,b,v;
Push(&OPTR,'#');
printf("\n\nPlease input an expression(Ending with #):");
ch=getchar();
GetTop(&OPTR,&ch_temp);
while(ch!='#'||ch_temp!='#')
{
if(ch>='0'&&ch<='9')//不是操作符,是操作数
{
int temp;
temp=ch-'0';//先把当前操作数从字符转换成数字
ch=getchar();
while(ch>='0'&&ch<='9')
{
temp=temp*10+ch-'0';
ch=getchar();
}
Push(&OVS,temp);
}
else
{
GetTop(&OPTR,&ch_temp);
switch(Compare(ch,ch_temp))
{
case '>':Push(&OPTR,ch);ch=getchar();break;
case '=':Pop(&OPTR,&op);ch=getchar();break;
case '<':Pop(&OPTR,&op);Pop(&OVS,&b);Pop(&OVS,&b);v=Execute(a,op,b);Push(&OVS,v);break;
}
}
GetTop(&OVS,&v);
return(0);
}
printf("the result is %d",(int)v);
}