一、要求:
输入一个表达式,表达式中只包含整数和加、减、乘、除四种双目运算符,计算给定表达式的值(参考中缀表达式求值)
二、代码:
#include
#include
#include
#define StackInitSize 100
#define StackIncrement 10
typedef struct{
char *base;
int top;
int stacksize;
}SqStack;
//******初始化********//
void InitStack(SqStack &S){
S.base = (char*)malloc(StackInitSize*sizeof(char));
if(!S.base)
return ;
S.top = 0; //栈顶指针初值为0
S.stacksize = StackInitSize; //空间大小初始值
}
//********判空**********//
int StackEmpty(SqStack S){
if(S.top==0)
return 1;
return 0;
}
//********入栈 ********//
void Push(SqStack &S,char e){
if(S.top>=S.stacksize){
S.base = (char*)realloc(S.base,(S.stacksize+StackIncrement)*sizeof(char));
if(!S.base)
return ;
S.stacksize += StackIncrement;
}
S.base[S.top++] = e;
}
//*********操作数出栈********//
void Pop_OPND(SqStack &S,int &e){
if(S.top==0)
return ;
e = S.base[--S.top];
}
//*********算符出栈********//
void Pop_OPTR(SqStack &S,char &e){
if(S.top==0)
return ;
e = S.base[--S.top];
}
//********获取栈顶元素*******//
char GetTop(SqStack S){
if(S.top==0)
return 0;
return S.base[S.top-1];
}
//*****定位theta在算符集合中的位置*******//
int Locate(char *s,char theta){
int i;
i = 0;
while(i<int(strlen(s))){
if(s[i]==theta)
return i;
else
i+=1;
}
if(i==int(strlen(s))){
printf("输入的算符theta有错误!");
return NULL;
}
}
//********获取两个算符的优先关系********//
char Compare(char theta1,char theta2){
int i,j;
char Prior[7][7] = {{'>','>','<','<','<','>','>'},
{'>','>','<','<','<','>','>'},
{'>','>','>','>','<','>','>'},
{'>','>','>','>','<','>','>'},
{'<','<','<','<','<','=',' '},
{'>','>','>','>',' ','>','='},
{'<','<','<','<','<',' ','>'}};
char OP[7] = {'+','-','*','/','(',')','#'};
i=Locate(OP,theta1);
j=Locate(OP,theta2);
return Prior[i][j];
}
//*****执行a theta b运算*********//
int Operate(int a,char theta,int b){
switch(theta){
case'+': return a+b;
case'-': return a-b;
case'*': return a*b;
case'/': return a/b;
}
}
//*****计算给定表达式的值*******//
int EvaluateExpression(SqStack OPTR,SqStack OPND,char *str){
char *p,ch,theta;
int num,a,b;
p = str;
Push(OPTR,*p);
p++;
while(*p!='#'||GetTop(OPTR)!='#'){
if(*p>='0' && *p<='9'){
num = 0;
while(*p!='#' && *p>='0' &&*p<='9'){
num = num * 10 + *p - '0';
p++;
}
Push(OPND,num);
}
else
switch(Compare(GetTop(OPTR),*p)){
case'<': Push(OPTR,*p); p++;
break;
case'=': Pop_OPTR(OPTR,ch); p++;
break;
case'>': Pop_OPND(OPND,b); Pop_OPND(OPND,a);
Pop_OPTR(OPTR,theta);
Push(OPND,Operate(a,theta,b));
break;
}
}
return GetTop(OPND);
}
void main(){
char a[50];
int result;
SqStack OPTR,OPND;
InitStack(OPTR);
InitStack(OPND);
printf("请输入一个只包含整数的加减乘除运算的表达式:\n");
gets(a);
result=EvaluateExpression(OPTR,OPND,a);
printf("表达式结果为:\n");
printf("%d",result);
printf("\n");
}
Direction:
代码仅代表本人初识数据结构时思路。