表达式求值

#include <iostream>
#include <stack>
#include <string>
#include <cctype>
using namespace std;

class Expression {
private:
	string exp;
	stack<char> st;
	stack<int> res;
public:
	void init();
	int calculate();
	int cal(int a, int b, char flag);
	bool isNumber(char c);
	bool priorityIsHigher(char a, char b);
};

int Expression::cal(int a, int b, char flag) {
	switch (flag) {
	case '+':return a + b;break;
	case '-':return a - b;break;
	case '*':return a * b;break;
	case '/':return a / b;break;
	}
	return 0;
}

int Expression::calculate() {
	bool flag;
	int value = 0;
	int a, b, result;
	for (string::iterator iter = exp.begin(); iter != exp.end(); iter++) {
		if (isNumber(*iter)) {
			value = value*10 + *iter - 48;
			flag = true;
		} else {
			if (flag) {
				res.push(value);
				flag = false;
				value = 0;
			}
			if (*iter == '(') {
				st.push(*iter);
			} else if (*iter == ')') {
				while(!st.empty() && st.top() != '(') {
					a = res.top();
					res.pop();
					b = res.top();
					res.pop();
					result = cal(b, a, st.top());
					st.pop();
					res.push(result);
				}
				st.pop();
			} else if (*iter == ' ') {
				continue;
			} else {
				if (!st.empty() && st.top() == '(') {
					st.push(*iter);
				} else {
					while (!st.empty() && !priorityIsHigher(*iter, st.top())) {
						a = res.top();
						res.pop();
						b = res.top();
						res.pop();
						result = cal(b, a, st.top());
						st.pop();
						res.push(result);
					}
					st.push(*iter);
				}
			}
		}
	}
	if (flag) {
		res.push(value);
	}
	while (!st.empty()) {
		a = res.top();
		res.pop();
		b = res.top();
		res.pop();
		result = cal(b, a, st.top());
		st.pop();
		res.push(result);
	}
	return res.top();
}

bool Expression::priorityIsHigher(char a, char b) {
	if (b == '(') {
		return true;
	}
	if ((a == '*' || a== '/') && (b == '+' || b == '-')) {
		return true;
	}
	return false;
}

bool Expression::isNumber(char c) {
	return isdigit(c);
}

void Expression::init() {
	std::cout << "enter an expression:";
	getline(std::cin, exp);
	//std::cout << exp;
}

int main() {
	Expression *e = new Expression();
	e->init();
	std::cout << e->calculate();
	return 0;
}
输入:3 + 9 - (2*3) + 10/5
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值