C++使用栈结构求表达式的值

代码如下:(内含注释)希望对大家有帮助
有不足之初也欢迎大家指正

 #include <iostream>
 #include <cmath>
 #include <cstring> 
 #include <stack> 
 using namespace std ;
 //判断是否为操作符
 bool IsOperation(char ch){
 	if(ch >= '0' && ch <= '9'){
 		return false ;
	 }else{
	 	return true ;
	 }
 } 
//栈内优先级
int InStackOperation(char operation){
	switch(operation){
		case '#' : return 0 ; break ;
		case '(' : return 1 ; break ;
		case '+' : return 3 ; break ;
		case '-' : return 3 ; break ;
		case '*' : return 5 ; break ;
		case '/' : return 5 ; break ;
		case '%' : return 5 ; break ;
		case '^' : return 7 ; break ;
		case ')' : return 8 ; break ;
	}
} 
//栈外优先级
int OutStackOperation(char operation){
	switch(operation){
		case '#' : return 0 ; break ;
		case '(' : return 8 ; break ;
		case '+' : return 2 ; break ;
		case '-' : return 2 ; break ;
		case '*' : return 4 ; break ;
		case '/' : return 4 ; break ;
		case '%' : return 4 ; break ;
		case '^' : return 6 ; break ;
		case ')' : return 1 ; break ;
	}
}
//计算
int Calculate(int m , int n , char oper){
	switch(oper){
		case '+' :  return m+n ; break ;
		case '-' :  return m-n ; break ;
		case '*' :  return m*n ; break ;
		case '/' :  return m/n ; break ;
		case '%' :  return m%n ; break ;
		case '^' :  return pow(m , n) ; break ;
	} 
} 
int main(){
	string str ;
	getline(cin , str) ;//一定要以#结尾 
	//声明一个 字符数组
	char equation[12] ;
	//将字符串转换为字符数组
	strcpy(equation, str.c_str());
	//输入
//	gets(equation) ;
	//设置数字栈和运算符栈
	stack<int> Num ;
	stack<char> Oper ;
	//开始计算流程 
	int begin = 0  , num1 , num2 , result;
	char topOper ;
	//先向操作符栈压入#
	Oper.push('#') ;
	char ch = equation[0] ;
	while(ch != '#'){
		if(!(IsOperation(ch))){
			//是数字压入数字栈
			Num.push((int)(ch)-48); 
		}else{//是操作则进行以下操作
			if(ch == ')'){
				topOper = Oper.top() ;
				while(topOper != '('){
					num1 = Num.top() ;
					Num.pop();
					num2 = Num.top() ;
					Num.pop() ;
					result = Calculate(num2 , num1 , topOper) ;
					Num.push(result) ;
					Oper.pop() ;
					topOper = Oper.top() ;
					
				}
			}else{
				topOper = Oper.top() ;//获取栈顶元素但不弹出
				while(OutStackOperation(ch) < InStackOperation(topOper)){
					Oper.pop() ; 
					topOper = Oper.top() ;
					//取出数字栈中的两个数字进行运算并将结果压入栈
					num1 = Num.top() ;
					Num.pop() ;
					num2 = Num.top() ;
					Num.pop() ;
					result = Calculate(num2 , num1 , topOper) ;
					Num.push(result) ;
					Oper.pop() ;
					topOper = Oper.top() ; 
					 
				} Oper.push(ch) ;
			}
		}begin++ ; ch = equation[begin] ;
	}	
	//
			Oper.pop() ; 
			topOper = Oper.top() ;
			while(topOper != '#'){
			num1 = Num.top() ;
			Num.pop() ;
			num2 = Num.top() ;
			Num.pop() ;
			result = Calculate(num2 , num1 , topOper) ;
			Num.push(result) ;
			Oper.pop() ;
			topOper = Oper.top() ; 
	}
	 //输出结果
	 cout<<Num.top() ;
	 return 0 ; 
	 
} 
	 

运行结果:
在这里插入图片描述

原创文章 23 获赞 8 访问量 1618

猜你喜欢

转载自blog.csdn.net/CSU_hjh/article/details/105209463
今日推荐