【数据结构】C++ 中缀表达式转后缀表达式求值 代码实现1.0

#include <iostream>
#include <stack>
#include <sstream> 
using namespace std;

void calculate(string s);
int prio(char op);
bool trans(string &str, string & str1);
void s2i(string str, int &num);

//返回符号优先级 
int prio(char op){
	int prio;
	if(op == '*' || op == '/'){
		prio = 2;
	}
	if(op == '+' || op == '-'){
		prio = 1;
	}
	if(op == '('){
		prio = 0;
	}
	return prio;
}

bool trans(string &str, string & str1){
	stack<char> s;
	int i = 0;
	for(i = 0; i < str.size(); i++){
		if(str[i] >= '0' && str[i] <= '9'){		//是数字直接写到式子上 
		
			str1 += str[i];
		}else{
			if(s.empty()){						//栈内空,直接进栈 
				s.push(str[i]);	
			} else if(str[i] == '('){			//左括号可直接进栈 
				s.push(str[i]);
			} else if(str[i] == ')'){			//右括号,弹出栈内元素,直到( 
				while(s.top() != '('){
					str1 += s.top();
					s.pop();
				}
				s.pop();		
			} else {
				while(prio(str[i]) <= prio(s.top())){	//符号优先级小于栈内符号优先级 
					str1 += s.top();					//栈内符号出栈 
					s.pop(); 
					if(s.empty()){
						break;
					} 
				}
				s.push(str[i]);
			}	
		}
	}
	while(!s.empty()){	//最后栈内不是空的,弹出栈内所有符号 
		str1+= s.top();
		s.pop(); 
	}
	return true;
} 

//字符转int 
void s2i(string str, int &num){
	stringstream ss;
	ss << str; 
	ss >> num;
}

//后缀表达式计算 
void calculate(string s){
	stack<char> ops;
	stack<int> vals;
	
	int left, right;
	for(int i = 0; i < s.length(); i++){
		if(s[i] >= '0' && s[i] <= '9'){		//数字,入数字栈 
			string s2 = "";
			while(s[i] >= '0' && s[i] <= '9'){
				s2 += s[i];
				i++;
			}
			int num;
			s2i(s2, num);
			vals.push(num);
		}else if(s[i] != ' '){				//非字符 
			if(!vals.empty()){
				right = vals.top();			//取右运算数 
				vals.pop();
			}
			if(!vals.empty()){
				left = vals.top();			//取左运算数 
				vals.pop();
			}
			switch(s[i]){
				case '+':
					vals.push(left + right);
					break;
				case '-':
					vals.push(left - right);
					break;
				case '*':
					vals.push(left * right);
					break;
				case '/':
					vals.push(left / right);
					break;
				default:
					break;
			}
			
		}
	}
	cout << vals.top() << endl; 
}

int main(int argc, char** argv) {
	string infix, postfix;
	cin >> infix;
	trans(infix, postfix);
	calculate(postfix);
	
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值