zoukankan      html  css  js  c++  java
  • 信息竞赛进阶指南--中缀表达式转后缀表达式并求值(模板)

    // 后缀表达式转中缀表达式,同时求值,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();
    }
    
  • 相关阅读:
    CF 142B Tprimes
    CF 231A Team
    poj 2001 Shortest Prefixes ——字典树入门
    hdu 1039 Easier Done Than Said?
    poj 2528 Mayor's posters
    hdu 1061 Rightmost Digit
    poj 2503 Babelfish
    CF271 A. Beautiful Year
    poj 2752
    CF271 B. Prime Matrix
  • 原文地址:https://www.cnblogs.com/lunatic-talent/p/12798252.html
Copyright © 2011-2022 走看看