• 信息竞赛进阶指南--中缀表达式转后缀表达式并求值(模板)


    // 后缀表达式转中缀表达式,同时求值,O(n)
    
    // 数值栈 
    vector<int> nums; 
    // 运算符栈 
    vector<char> ops;
    
    // 优先级 
    int grade(char op) {
    	switch (op) {
    	case '(':
    		return 1;
    	case '+':
    	case '-':
    		return 2;
    	case '*':
    	case '/':
    		return 3;
    	}
    	return 0;
    }
    
    // 处理后缀表达式中的一个运算符 
    void calc(char op) {
    	// 从栈顶取出两个数 
    	int y = *nums.rbegin();
    	nums.pop_back();
    	int x = *nums.rbegin();
    	nums.pop_back();
    	int z;
    	switch (op) {
    	case '+':
    		z = x + y;
    		break;
    	case '-':
    		z = x - y;
    		break;
    	case '*':
    		z = x * y;
    		break;
    	case '/':
    		z = x / y;
    		break;
    	}
    	// 把运算结果放回栈中 
    	nums.push_back(z);	
    }
    
    // 中缀表达式转后缀表达式,同时对后缀表达式求值 
    int solve(string s) {
    	nums.clear();
    	ops.clear();
    	int top = 0, val = 0;
    	for (int i = 0; i < s.size(); i++) {
    		// 中缀表达式的一个数字 
    		if (s[i] >= '0' && s[i] <= '9') {
    			val = val * 10 + s[i] - '0';
    			if (s[i+1] >= '0' && s[i+1] <= '9') continue;
    			// 后缀表达式的一个数,直接入栈 
    			nums.push_back(val);
    			val = 0;
    		}
    		// 中缀表达式的左括号 
    		else if (s[i] == '(') ops.push_back(s[i]);
    		// 中缀表达式的右括号 
    		else if (s[i] == ')') {
    			while (*ops.rbegin() != '(') {
    				// 处理后缀表达式的一个运算符 
    				calc(*ops.rbegin());
    				ops.pop_back();
    			}
    			ops.pop_back();
    		}
    		// 中缀表达式的加减乘除号 
    		else {
    			while (ops.size() && grade(*ops.rbegin()) >= grade(s[i])) {
    				calc(*ops.rbegin());
    				ops.pop_back();
    			}
    			ops.push_back(s[i]);
    		} 
    	}
    	while (ops.size()) {
    		calc(*ops.rbegin());
    		ops.pop_back();
    	}
    	// 后缀表达式栈中最后剩下的数就是答案 
    	return *nums.begin();
    }
    
  • 相关阅读:
    20135326、20135303linux实验二实验报告
    家庭作业汇总
    信息安全系统设计基础第十周学习总结
    信息安全系统设计基础第十二周总结
    20135326王亦可信息安全系统设计基础期末总结
    第十一周学习总结
    20135326、20135303linux实验四实验报告
    20135326、20135303linux实验一实验报告
    第十四周学习笔记
    20135326、20135303linux实验三实验报告
  • 原文地址:https://www.cnblogs.com/lunatic-talent/p/12798252.html
Copyright © 2020-2023  润新知