表达式求值(C语言)

代码可以实现的功能:

  • 可以计算任意正整型
  • 但是只可以进行 + - * / () 运算

我写的代码,
因为我想代码可以实现:表达式可以计算任意正整型数,所以定义了两个栈,分别用来存放操作符和操作数;
批注:如果只定义一个栈,我觉得我只能做到,我的代码只能计算0到9的表达式
因为定义了两个栈(存放不同类型的值,一个存放字符,一个存放数值),所以初始化,入栈,出栈,取栈顶元素的函数都要写两遍

然后核心就是,表达式的代码,要解决优先级的问题

再加个提醒吧:代码中出现的

  • TR:代表operater,即运算符:+ - * / ()
  • ND:代表operand,即操作数:整型的数值

哦,对了,还有一个血的教训,在控制台中输入表达式时,如果有(),必须用英文输入法输入(),不然,嘿嘿,心态爆炸

#include<iostream>
using namespace std;

#define starksize 100 
typedef struct{
	char *base;
	char *top;
	int length ;
}StarkTR; //寄存运算符

typedef struct{
	int *base;
	int *top;
	int length ;
}StarkND; //寄存操作数 
 
int InitTR(StarkTR &L){   //初始化寄存operater栈 
	L.base = new char[starksize];
	L.top = L.base;
	L.length = starksize; 
	return 1;
}
int InitND(StarkND &L){   //初始化寄存operand栈 
	L.base = new int[starksize];
	L.top = L.base;
	L.length = starksize; 
	return 1;
}

int PushTR(StarkTR &L,char e){   //入栈 
	if(L.top - L.base == L.length){
		cout<<"栈满!";
		return 0; 
	}
	*L.top++ = e;
	return 1;
}
int PushND(StarkND &L,int e){   //入栈 
	if(L.top - L.base == L.length){
		cout<<"栈满!";
		return 0; 
	}
	*L.top++ = e;
	return 1;
}

char PopTR(StarkTR &L,char &e){   //出栈 
	if(L.top - L.base == 0){
		cout<<"栈空!";
		return 0;
	}
	e = *--L.top;
	return 1;
}
int PopND(StarkND &L,int &e){   //出栈 
	if(L.top - L.base == 0){
		cout<<"栈空!";
		return 0;
	}
	e = *--L.top;
	return 1;
}

char GetTopTR(StarkTR L){  //取栈顶元素 
	if(L.top != L.base)
		return *(L.top -1); 
}
int GetTopND(StarkND L){  //取栈顶元素 
	if(L.top != L.base)
		return *(L.top -1); 
}

char Precede(char a,char b){     //< > = 都代表优先级 
								 //只考虑 + - * / ( ) 的运算 
	if(a == '+'||a == '-'){
		if(b == '+'||b == '-'||b == ')'||b == '#')return '>';
		else return '<';
	}
	else if(a == '*'||a == '/'){
		if(b == '+'||b == '-'||b == ')'||b == '#'||b == '*'||b == '/')return '>';
		else return '<';
	}
	else if(a == '('){
		if(b == ')')return '=';
		else return '<';
	}
	else if(a == ')'){
		return '>';
	}
	else{
		if(b == '#')return '=';
		else return '<';
	}
}          

int Operate(int a,char s,int b){
	if(s == '+'){
		return a+b;
	}
	else if(s == '-'){
		return a-b;
	}
	else if(s == '*'){
		return a*b;
	}
	else if(s == '/'){
		return a/b;
	}
}


int EvaluateExpression(){
	StarkTR operater;
	StarkND operand;
	char ch,op;
	int t,k,a,b;
	InitTR(operater);
	InitND(operand);
	PushTR(operater, '#'); //将表达式起始符“#”压入operater栈中
	cout<<"please input a evaluate expression(以 # 结束,只能运算 + - * /):"<<endl;
	cin>>ch;
	while(ch != '#'||GetTopTR(operater) != '#'){
		t = 0;
		k = 0;
		while(ch <= '9'&&ch >= '0'){
			t = t*10 + (ch - 48);   //0的ASCLL码是48 
			cin>>ch; 
			k++;
		}
		if(k)PushND(operand,t);
		switch(Precede(GetTopTR(operater),ch)){
			case '<':
				PushTR(operater,ch);
				cin>>ch;
				break;
			case '>':
				PopTR(operater,op);
				PopND(operand,b);
				PopND(operand,a);
				PushND(operand,Operate(a,op,b));
				break;
			case '=':
				PopTR(operater,op);
				cin>>ch;
				break; 	
		}			
	} 
	return GetTopND(operand); 
}

int main(){
	cout<<EvaluateExpression();
	return 0;
}


猜你喜欢

转载自blog.csdn.net/Zhangguohao666/article/details/83620321