数据结构:栈的应用(中缀表达式)

一、要求:

输入一个表达式,表达式中只包含整数和加、减、乘、除四种双目运算符,计算给定表达式的值(参考中缀表达式求值)

二、代码:

#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");
}

结果:
数据结构:栈的应用(中缀表达式)_第1张图片
数据结构:栈的应用(中缀表达式)_第2张图片


Direction:

代码仅代表本人初识数据结构时思路。

你可能感兴趣的:(数据结构,c语言,数据结构,栈,算法)