C++实现四则运算(后缀表达式,包含括号,多位数)

符号之间的运算优先级如下:

#include<bits/stdc++.h>
using namespace std;
string s;
stack<int>val;
stack<char>symbol;
//操作符之间的优先级的比较
char cmp(char a,char b){
	if(a=='#'){
		if(b=='#'){
			return '=';
		}else{
			return '<';
		}
	}
	if(a=='+'||a=='-'){
		if(b=='*'||b=='/'||b=='('){
			return '<';
		}else{
			return '>';
		}
	}
	if(a=='*'||a=='/'){
		if(b=='('){
			return '<';
		}else{
			return '>';
		}
	}
	if(a=='('){
		if(b==')'){
			return '=';
		}else{
			return '<';
		}
	}
} 
//返回计算结果
int cal(int a,int b,char op){
	switch(op){
		case '+':
			return a+b;
		case '-':
			return a-b;
		case '*':
			return a*b;
		case '/':
			return a/b;
	}
} 
//判断是否为运算符
bool isop(char c){
	static string pp("+-*/()#");
	if(pp.find(c)==string::npos){
		return false;
	}
	return true;
} 
//表达式计算的过程
int process(){
	int i=0,num=0;
	while(s[i]!='#'||symbol.top()!='#'){
		if(!isop(s[i])){
			//非运算符,即为操作数
			num=0;
			while(!isop(s[i])){
				num*=10;
				num+=s[i]-'0';
				++i;
			}
			val.push(num); 
		}
		else{
			switch(cmp(symbol.top(),s[i])){
				case '<':
					symbol.push(s[i]);
					++i;
					break;
				case '=':
					symbol.pop();
					++i;
					break;
				case '>':
					int a=val.top();
					val.pop();
					int b=val.top();
					val.pop();
					val.push(cal(b,a,symbol.top()));
					symbol.pop();
					break;
			}
		}
	}
	symbol.push('#');
	int res=val.top();
	val.pop();
	return res;
} 
int main(){
	symbol.push('#');
	while(cin>>s){
		cout<<process()<<endl;
	}
	return 0;
}

稍作修改后的另一份代码

#include<bits/stdc++.h>
using namespace std;
string s;
stack<int>val;
stack<char>symbol;
//操作符之间的优先级的比较
char cmp(char a,char b){
//右括号不会进栈,不必写右括号的优先级 
//遇到右括号就弹出左括号 
    if(a=='#'){
		if(b=='#'){
			return '=';
		}else{
			return '<';
		}
	}
	if(a=='+'||a=='-'){
		if(b=='*'||b=='/'||b=='('){
			return '<';
		}else{
			return '>';
		}
	}
	if(a=='*'||a=='/'){
		if(b=='('){
			return '<';
		}else{
			return '>';
		}
	}
	if(a=='('){
		if(b==')'){
			return '=';
		}else{
			return '<';
		}
	}
} 
//返回计算结果
int cal(int a,int b,char op){
	switch(op){
		case '+':
			return a+b;
		case '-':
			return a-b;
		case '*':
			return a*b;
		case '/':
			return a/b;
	}
}  
//表达式计算的过程
int process(){
	int i=0,num=0;
	while(symbol.top()!='#'||i<s.size()){
		if(s[i]>='0'&&s[i]<='9'){
			//为操作数
			num=0;
			while(s[i]>='0'&&s[i]<='9'){
				num*=10;
				num+=s[i]-'0';
				++i;
			}
			val.push(num);
			//cout<<"num="<<num<<endl; 
		}
		else{
			switch(cmp(symbol.top(),s[i])){
				case '<':
					symbol.push(s[i]);
					++i;
					break;
				case '=':
					symbol.pop();
					++i;
					break;
				case '>':
					int a=val.top();
					val.pop();
					int b=val.top();
					val.pop();
					val.push(cal(b,a,symbol.top()));
					//cout<<"a="<<a<<" "<<"b="<<b<<endl;
					//cout<<"num="<<val.top()<<endl;
					symbol.pop();
					break;
			}
		}
	}
	int res=val.top();
	val.pop();
	return res;
} 
int main(){
	symbol.push('#');
	while(cin>>s){
		cout<<process()<<endl;
	}
	return 0;
}

 

 


版权声明:本文为amf12345原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。