使用栈来计算后缀表达式

后缀表达式

我们平时写的都是中缀表达式,也就是将运算符写在2个操作数中间
而后缀表达式 则是将运算符写在2个操作数后面
例如:

 (a+b)*c-(a+b)/e 的后缀表达式为:ab+c*ab+e/-

计算思路

从左到右扫描输入串(string数组):
1、若当前字符为数字(操作数),则将其放入栈
2、若当前字符为运算符,则依次取出栈顶的2个数,进行对应的运算,并将运算结果放入栈
3、指针读取下一个字符,回到第1步


当遍历完数组后,栈中的唯一一个元素即为计算结果

代码实现(C++)

假设输入的字符串是一个 string类的数组
全局定义栈的相关变量和方法

const int N=100; //定义栈的最大容量
string data[N]; //使用数组表示栈
int top=-1; //指向栈顶元素下标

//判断栈是否为空 
bool isEmpty(){
      return top==-1 ? true : false;
}

//入栈 
void Push(string ele){
	if(top>=N-1){
		cout<<"栈已满,无法插入"<<endl;
		return;
	}
	
	data[top+1]=ele;
	top++;
	return;
}

//出栈 
string Pop(){
	if(isEmpty()==true){
		cout<<"栈已空,无法出栈"<<endl;
		return "!";
	}
	
	string topEle=data[top];
	data[top]="null";
	top--;
	return topEle;
}

除此之外,我们需要一个判断当前字符是否为数字的函数(利用ASCII码判别)

bool isDigit(string v){
	if(int(v[0])<=57&&int(v[0])>=48){
		return true;
	}else{
		return false;
	}
}

用于计算表达式结果的函数

//传入string数组以及数组长度
void calculate(string input[],int len){
    
	for(int i=0;i<len;i++){
		
		if(isDigit(input[i])==true){
			Push(input[i]);
		}else{
            // 将取出的栈顶元素转换成int
			int v2=stoi(Pop());
			int v1=stoi(Pop());
			
			if(input[i]=="+"){
				Push(to_string(v1+v2));
			}else if(input[i]=="-"){
				Push(to_string(v1-v2));
			}else if(input[i]=="*"){
				Push(to_string(v1*v2));
			}
			else if(input[i]=="/"){
				Push(to_string(v1/v2));
			}else{
				cout<<"ERROR"<<endl;
			}
		}
	}
	
	cout<<data[0]<<endl;
	return;
}

参考样例:
string input[]={"6","2","/","3","-","4","2","*","+"};
计算结果为:8

原文地址:https://www.cnblogs.com/baebae996/p/13813824.html