//说明:只能进行10以内整数的加减乘除,并且表达式的值要以“#”结尾
#include <malloc.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define TRUE 1
#define FALSE 0
#define ERROR 0
#define OK 1
#define STACK_INIT_SIZE 100 //存储空间初始分配量//
#define STACKINCREMENT 10 //存储空间分配增量//
typedef char SElemType;
typedef int Status;
char a[][7]={
{'>','>','<','<','<','>','>'},
{'>','>','<','<','<','>','>'},
{'>','>','>','>','<','>','>'},
{'>','>','>','>','<','>','>'},
{'<','<','<','<','<','=',' '},
{'>','>','>','>',' ','>','>'},
{'<','<','<','<','<',' ','='}
};
/*char a[][]={
{'>','>','>','>','<','>','<'},
{'>','>','>','>','<','>','<'},
{'<','<','>','>','<','>','<'},
{'<','<','>','>','<','>','<'},
{'<','<','<','<','<',' ','<'},
{'>','>','>','>','=','>',' '},
{'>','>','>','>',' ','>','='}
};*/
char OP[7]={'+','-','*','/','(',')','#'};
typedef struct
{
SElemType* base; //在栈构造之前和销毁之后,base的值为NULL//
SElemType* top; //栈顶指针//
int stacksize; //当前已分配的存储空间,以元素为单位//
}SqStack;
//构造一个空栈S//
int InitStack(SqStack &S)
{
S.base=(SElemType*)malloc(STACK_INIT_SIZE *sizeof(SElemType));
if(!S.base)
exit(ERROR); //存储分配失败//
S.top=S.base;
S.stacksize =STACK_INIT_SIZE;
return OK;
}
Status GetTop(SqStack S)
{ //若栈不为空,则用e返回S的栈顶元素,并返回OK,否则返回ERROR//
if(S.top==S.base)
return ERROR;
return *(S.top-1);
}
//插入元素//
int Push(SqStack &S, SElemType e)
{ //插入元素e为新的栈顶元素//
if(S.top-S.base>=S.stacksize)
{ //栈满,追加存储空间//
S.base=(SElemType*)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(SElemType));
if(!S.base)
exit(ERROR); //存储分配失败//
S.top=S.base+S.stacksize;
S.stacksize+=STACKINCREMENT;
}
*S.top++=e;
return OK;
}
int Pop(SqStack &S, SElemType &e)
{ //若栈不为空,则删除S的栈顶元素,用e返回其值,并返回//
if(S.top==S.base)
return ERROR;
e=*(--S.top);
return OK;
}
//检查是否为空栈//
int EmptyStack(SqStack &S)
{
if(S.top==S.base)
return 1;
else
return 0;
}
/*int ListTraverse(SqStack S,Status(*visit)(SElemType))
{
SElemType *p;
p=S.base;
for(p=S.base;p<S.top;p++)
(*visit)(*p);
return OK;
}*/
int Precede(char c1,char c2)
{
int i,j;
switch(c1)
{
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;
}
switch(c2)
{
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;
}
return a[i][j];
}
int Operate(char a,char theta,char b)
{
char result,i,j;
i=a-48;
j=b-48;
switch(theta)
{
case'+':result=i+j+48;break;//因为数值是char型,所以要将0~9的ASCII码值转化为数值,进行计算后再转为ASCII码值存储
case'-':result=i-j+48;break;
case'*':result=(i*j)+48;break;
case'/':result=(i/j)+48;break;
}
return result;
}
int In(char c,char OP[])
{
int i,f=0;
for(i=0;i<7;i++)
{
if(c==OP[i])
{
f=1;
break;
}
}
if(f==0)
return 0;
else return 1;
}
//表达式求值//
int EvaluateExpression()
{
// int a,b,c;
char a,b,c,r;
char theta,x;
SqStack OPTR;
SqStack OPND;
InitStack(OPTR);
Push(OPTR,'#');
InitStack(OPND);
c=getchar();
while(c!='#'||GetTop(OPTR)!='#')
{
if(!In(c,OP))
{
Push((OPND),c);
c=getchar();
}
else
switch(Precede(GetTop(OPTR),c))
{
case'<':
Push(OPTR,c);
c=getchar();
break;//1+2#:如加上printf("1234%c\n",c)语句可以看到c为+号
case'=':
Pop(OPTR,x);
c=getchar();break;
case'>':
Pop(OPND,b);
Pop(OPTR,theta);
Pop(OPND,a);
Push(OPND,Operate(a,theta,b));
break;//theta未取到栈顶元素,即在1+2的过程中theta未取到+号
}
}
r=GetTop(OPND)-48;//将数值由ASCII码值转化为十进制的数值
return r;
}
void main()
{
int c;
printf("请输入需要计算的表达式:\n");
c=EvaluateExpression();
printf("result=%d\n",c);
}
这里是通过数据结构中的栈来实现简单的数学计算,现有程序还不完善,不能进行小数和两位数以上的加减乘除算法,后续还会进行改进的。