题解 | #表达式求值#

表达式求值

http://www.nowcoder.com/practice/c215ba61c8b1443b996351df929dc4d4

先求后缀表达式,然后根据后缀表达式求值

class Solution {
	public:
	/**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     * 返回表达式的值
     * @param s string字符串 待计算的表达式
     * @return int整型
     */
	int solve(string s) {
		// write code here
		return cal(getPostExp(s));
	}
	int getPriority(char ch) {
		if(ch == '+' || ch == '-') return 2; else if(ch == '(') return 1; else return 3;
	}
	std::vector<string> getPostExp(string str) {
		stack<char> s;
		vector<string> ret;
		string tmp_num;
		for (char ch : str) {
			if (ch >= '0' && ch <= '9')
			            tmp_num += ch; else if (ch == '+' || ch == '-' || ch == '*') {
				if (tmp_num.size()) {
					ret.push_back(tmp_num);
					tmp_num.clear();
				}
				while (s.size() && getPriority(s.top()) >= getPriority(ch)) {
					string tmp(1, s.top());
					ret.push_back(tmp);
					s.pop();
				}
				s.push(ch);
			} else {
				if (tmp_num.size()) {
					ret.push_back(tmp_num);
					tmp_num.clear();
				}
				if (ch == '(')
				                s.push(ch); else {
					while (!s.empty() && s.top() != '(') {
						string tmp(1,s.top());
						ret.push_back(tmp);
						s.pop();
					}
					if(!s.empty() && s.top() == '(')
					                    s.pop();
				}
			}
		}
		if (tmp_num.size()) {
			ret.push_back(tmp_num);
		}
		while (s.size()) {
			string tmp(1, s.top());
			ret.push_back(tmp);
			s.pop();
		}
		return ret;
	}
	int cal(vector<string> str) {
		stack<int> s;
		for (string ch : str) {
			if (ch != "+" && ch != "-" && ch != "*") {
				int tmp = atoi(ch.c_str());
				//cout << tmp << endl;
				s.push(tmp);
			} else {
				int tmp;
				int num2 = s.top();
				s.pop();
				int num1 = s.top();
				s.pop();
				if (ch == "*") {
					tmp = num1 * num2;
				} else if (ch == "-") {
					tmp = num1 - num2;
				} else {
					tmp = num1 + num2;
				}
				s.push(tmp);
			}
		}
		return s.top();
	}
};
全部评论

相关推荐

10-28 11:04
已编辑
美团_后端实习生(实习员工)
一个2人:我说几个点吧,你的实习经历写的让人觉得毫无含金量,你没有挖掘你需求里的 亮点, 让人觉得你不仅打杂还摆烂。然后你的简历太长了🤣你这个实习经历看完,估计没几个人愿意接着看下去, sdk, 索引这种东西单拎出来说太顶真了兄弟,好好优化下简历吧
点赞 评论 收藏
分享
小红书 后端选手 n*16*1.18+签字费期权
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务