c++计算表达式(支持()[]+-*/)

源码里面有注释,就不详细讲了:

#include<bits/stdc++.h>
using namespace std;
char pd(char op1,char op2){ //判断优先级
	
	string yxjb="++> +-> +*< +/< +(< +)> +#> +[< +]> -+> --> -*< -/< -(< -)> -#> -[< -]> *+> *-> **> */> *(< *)> *#> *[< *]> /+> /-> /*> //> /(< /)> /#> /[< /]> (+< (-< (*< (/< ((x ()= (#x ([x (]x )+> )-> )*> )/> )(x ))x )#> )[> )]> #+< #-< #*< #/< #(< #)x ##= #[< #]x [+< [-< [*< [/< [(< [)x [#x [[< []= ]+> ]-> ]*> ]/> ](< ])> ][> ]]> ]#>";
	
	for(int i=1; i<=81; i++)
		if(yxjb[i*4-4] == op1 && yxjb[i*4-3] == op2)
			return yxjb[i*4-2];
	
	
	return 'x';
	
}
int main() {


	stack<int> num;
	stack<char> op;
	int i=0;
	string s;
	
	cin >> s;
	
	op.push('#');
	
	while(!(i >= s.size() && op.top() == '#')){
		
		if(s[i] >= 48 && s[i] <= 57){
			
			int n=s[i]-48;
			
			i++;
			
			while(s[i] >= 48 && s[i] <= 57){ //数字可能有好几位,需要一个循环
				
				n=n*10+(s[i]-48);
				i++;
				
			}
			
			num.push(n);
			
		}else{
			
			char yxj = pd(op.top(),s[i]);
			
			if(yxj == '<'){ //如果优先级比这个低,不能直接算,先放入栈
				op.push(s[i]);
				i++;
			}else if(yxj == '='){ //括号匹配
				op.pop();
				i++;
			}else{ //如果优先级比这个高,直接计算掉
				int _a=num.top();
				num.pop();
				
				int _b=num.top();
				num.pop();
				
				int _op=op.top();
				op.pop();
				
				/*
				这里只写了加、减、乘、除,其实,可以增加更多的运算符
				比如:
				if(_op == '^')
					num.push(pow(_a,_b));
				*/
				
				if(_op == '+')
					num.push(_a+_b);
				if(_op == '-')
					num.push(_a-_b);
				if(_op == '*')
					num.push(_a*_b);
				if(_op == '/')
					num.push(_a/_b);
			}
			
			
		}
		
		
		
	}

	
	cout << num.top();
	
	num.pop();


	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值