主函数
/*
程序运行时,输入合法的算术表达式(中间值及最终结果要在0~9之间,可以包括加减乘除和括号),便可输出相应的计算结果。
*/
#include<stdio.h>
#include"stack.h"
int main()
{
printf("请输入算术表达式(中间值及最终结果要在0-9之间),并以#结束\n");
printf("运算结果为:%f\n",EvaluateExpression());
return 0;
}
.h
#define STACK_INT_SIZE 100
#define STACKINCREMENT 10
#define True 1
#define False 0
#define OVERFLOW -2
#define OK 1
#define ERROR -1
typedef char SElemType;
typedef struct{
SElemType *base;
SElemType *top;
int stacksize;
}SqStack;
int InitStack(SqStack &S);
int Push(SqStack &S,SElemType e);
int Pop(SqStack &S,SElemType &e);
int GetTop(SqStack S,SElemType &e);
int In(char c);//判断c是否为运算符
int Precede(char t1,char t2);//判断运算符t1 t2的优先级
int Operate(int a,char theta,int b);//对a和b进行二元运算theta
//OperandType EvaluateExpression();
char EvaluateExpression();
#include<stdio.h>
#include"stack.h"
#include<stdlib.h>
#include<malloc.h>
int In(char c)//判断c是否为运算符
{
switch(c){
case'+':
return True;
case'-':
return True;
case'*':
return True;
case'/':
return True;
case'=':
return True;
case'(':
return True;
case')':
return True;
case'#':
return OVERFLOW;
default: return False;
}
}
int Precede(char t1,char t2)//判断运算符t1 t2的优先级
{
int i,j;
char pre[][7] = {
//将运算符之间的优先级制作成一张表格
{'>', '>', '<', '<', '<', '>', '>'},
{'>', '>', '<', '<', '<', '>', '>'},
{'>', '>', '>', '>', '<', '>', '>'},
{'>', '>', '>', '>', '<', '>', '>'},
{'<', '<', '<', '<', '<', '=', '0'},
{'>', '>', '>', '>', '0', '>', '>'},
{'<', '<', '<', '<', '<', '0', '='}
};
/*if(t2=='+')
{
if(t1=='('||t1=='#') return '<';
return '>';
}
if(t2=='-')
{
if(t1=='('||t1=='#') return '<';
return '>';
}
if(t2=='*')
{
if(t1=='*'||t1=='/'||t1==')') return '>';
return '<';
}
if(t2=='/')
{
if(t1=='*'||t1=='/'||t1==')') return '>';
return '<';
}
if(t2=='(') return '<';
if(t2==')')
{
if(t1=='(') return '=';
return '>';
}
if(t2=='#')
{
if(t1=='#') return '=';
return '>';
}
*/
switch (t1) {
case '+':
i = 0;
break;
case '-':
i = 1;
break;
case '*':
i = 2;
break;
case '/':
i = 3;
break;
case '(':
i = 4;
break;
case ')':
i = 5;
break;
case '#':
i = 6;
break;
default:
return OVERFLOW;
}
switch (t2) {
case '+':
j = 0;
break;
case '-':
j = 1;
break;
case '*':
j = 2;
break;
case '/':
j = 3;
break;
case '(':
j = 4;
break;
case ')':
j = 5;
break;
case '#':
j = 6;
break;
default:
return OVERFLOW;
}
return pre[i][j];
}
int Operate(int a,char theta,int b)//对a和b进行二元运算theta
{
switch(theta){
case'+':
return a+b;
case'-':
return a-b;
case'*':
return a*b;
case'/':
return a/b;
}
}
int InitStack(SqStack &S)
{
S.base=(SElemType *)malloc(STACK_INT_SIZE *sizeof(SElemType));
if(!S.base) exit(OVERFLOW);//存储分配失败
S.top=S.base;
S.stacksize= STACK_INT_SIZE;//初始容量
return OK;
}
int Push(SqStack &S,SElemType e)
{
if(S.top-S.base>=S.stacksize){
S.base=(SElemType *)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(SElemType));
if(!S.base) exit(OVERFLOW);
S.top=S.base+S.stacksize;
S.stacksize+=STACKINCREMENT;
}
*S.top++=e;
return OK;
}
int Pop(SqStack &S,SElemType *e)
{
if(S.top==S.base) return ERROR;
*e=*--S.top;
return OK;
}
int GetTop(SqStack S,SElemType &e)
{
if(S.top==S.base) return ERROR;
e=*(S.top-1);
return OK;
}
//OperandType EvaluateExpression()
char EvaluateExpression()
{
SqStack OPTR;
SqStack OPND;
char c,x,a,b,theta,e;
InitStack(OPTR);//运算符栈
Push(OPTR,'#');
InitStack(OPND);//运算数栈
c=getchar();//接受字符
while(c!='#'||GetTop(OPTR,e)!='#')
{
if(!In(c)){
Push(OPND,c-'0');
c=getchar();
}
else
switch(Precede(GetTop(OPTR,e),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;
}
}
return GetTop(OPND,e);
}
case'<'
case'='
case'>'
这些case 与'<'符号之间没有空格,连在一起了吧?