栈的应用-复杂表达式求值(含多位数、小数)

168 阅读1分钟
#include<iostream>
#include<stdlib.h>
#include<iomanip>
#include<stack>
using namespace std;
int compare(char s){   //判断优先级的函数 
	switch(s){
		case '#': return 0;//#优先级最低 
		case '(': return 1; //特殊情况 
		case '+': return 2;
		case '-': return 2;
		case '*': return 3;
		case '/': return 3;
		case ')': return 4;
	}
}
string toPostFix(string str){  //转后缀表达式 (数字用下划线分隔) 
	string num;
	stack<char>s;
	int i=0;
	while(i<str.size()){
		if((str[i]>='0'&&str[i]<='9')||str[i]=='.'){
			num.push_back(str[i]);
			i++;
			if(!((str[i]>='0'&&str[i]<='9')||str[i]=='.')){
				num.push_back('_');//用下划线分隔数字 
			}
		}
		else{
			if(s.empty()||str[i]=='('){
				s.push(str[i]);
				i++;
				continue; 
			}
			if(compare(str[i])>compare(s.top())||s.top()=='('){
				if(str[i]==')'){
					while(s.top()!='('){
						num.push_back(s.top());
						s.pop();
					}
					s.pop();
					i++;
					continue;
				}
				s.push(str[i]);
				i++;
			}
			else{
				num.push_back(s.top());
				s.pop();
			}
		}
	}
	return num;
}
float calc(string str){ //计算后缀表达式 
	stack<float>s;
	str.push_back('#');
	int i=0;
	float a,b;
	while(1){
		if(str[i]=='#'){
			break;
		}
		string n="";
		int flag=1;
		while((str[i]>='0'&&str[i]<='9'&&flag)||str[i]=='.'||str[i]=='_'){
			if(str[i]=='_'){    //字符串转数字并压入栈顶 
				s.push(atof(n.c_str()));
				flag=0;
			}
			else{
				n+=str[i];
			}
			i++;
		}
		if(!((str[i]>='0'&&str[i]<='9')||str[i]=='.'||str[i]=='_')){
			a=s.top();
			s.pop();
			b=s.top();
			s.pop();
		    switch(str[i]) {
	            case '*': 
	                s.push(a*b);
	                break;
	            case '/':
	                s.push(b/a);
	                break;
	            case '+':
	                s.push(a+b);
	                break;
	            case '-':
	                s.push(b-a);
	                break;
        }
        	i++;
		}
	}
	return s.top();
}
int main(){
	string str;
	cin>>str;
//	cout<<toPostFix(str)<<endl;
	cout<<setiosflags(ios::fixed)<<setprecision(2)<<calc(toPostFix(str));
	return 0;
}