表达式求值

class ExpValue {
public:
	typedef long long int T;
	string trim(string& input) {
		string ret;
		for (int i = 0; i < input.size(); i++) {
			if (input[i] != ' ')ret.push_back(input[i]);
		}
		return ret;
	}
	T getValue(string& input) {
		string s = trim(input); s.push_back('#');

		stack<char> sign; sign.push('#');
		stack<T> num;

		int n = s.size();
        int cnt = 1;
		for (int i = 0; i < n; i++) {
			if (isalnum(s[i])) {
				T v = 0;
				while (i < n && isalnum(s[i])) {
					v = v * 10 + s[i] - '0';
					i++;
				}
				num.push(v); i--;
                cnt = 0;
			}
			else {
				char flag;
				while ((flag = getPriority(sign.top(), s[i])) == '>') {
					T b = num.top(); num.pop();
					T a = num.top(); num.pop();
					num.push(getFun(a, b, sign.top()));
					sign.pop();
				}
				if (flag == '<') {
                    if(cnt && (s[i] == '-' || s[i] == '+')){
                        num.push(0);
                    }
					sign.push(s[i]);
                    cnt++;
				}
				else if (flag == '=') {
					sign.pop();
				}
			}
		}
		return num.top();
	}
	T getFun(T a, T b, char sign) {
        cout << a << " " <<   sign << " " << b << endl;
		switch (sign)
		{
		case '+':return a + b;
		case '-':return a - b;
		case '*':return a * b;
		case '/':return a / b;
		default:break;
		}
		return 0;
	}
	char getPriority(char a, char b) {
		int id = signId(a), id2 = signId(b);
		return _exp_priority[id][id2];
	}
private:
	char _exp_priority[7][7] =
	{
		'>', '>', '<', '<', '<', '>', '>',
		'>', '>', '<', '<', '<', '>', '>',
		'>', '>', '>', '>', '<', '>', '>',
		'>', '>', '>', '>', '<', '>', '>',
		'<', '<', '<', '<', '<', '=', ' ',
		'>', '>', '>', '>', ' ', '>', '>',
		'<', '<', '<', '<', '<', ' ', '='
	};
	int signId(char ch) {
		switch (ch)
		{
		case '+':return 0;
		case '-':return 1;
		case '*':return 2;
		case '/':return 3;
		case '(':return 4;
		case ')':return 5;
		case '#':return 6;
		default:
			return -1;
		}
	}
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值