zoukankan      html  css  js  c++  java
  • leetcode Basic Calculator

    题目连接

    https://leetcode.com/problems/basic-calculator/  

    Basic Calculator

    Description

    Implement a basic calculator to evaluate a simple expression string.

    The expression string may contain open ( and closing parentheses ), the plus + or minus sign -, non-negative integers and empty spaces .

    You may assume that the given expression is always valid.

    Some examples: 
    “1 + 1 = 2” 
    “2-1 + 2 ” = 3 
    “(1+(4+5+2)-3)+(6+8)” = 23 
    Note: Do not use the eval built-in library function.

    表达式计算。。

    class ExpCalc {
    private:
    	string ret;
    	stack<char> op;
    	stack<int> num;
    	inline void erase() {
    		ret = "";
    		while (!op.empty()) op.pop();
    		while (!num.empty()) num.pop();
    	}
    	inline int calc(int d1, int d2, char ch) {
    		int val = 0;
    		switch (ch) {
    			case '+': val = d1 + d2;
    				break;
    			case '-': val = d2 - d1;
    				break;
    		}
    		return val;
    	}
    public:
    	ExpCalc() { erase(); }
    	~ExpCalc() { erase(); }
    	inline void InfixToPostfix(const string src) {
    		int n = src.length();
    		for (int i = 0; i < n;) {
    			if (' ' == src[i] || '=' == src[i]) { i++; continue; }
    			if ('(' == src[i]) op.push(src[i++]);
    			if (')' == src[i]) {
    				while (op.top() != '(') {
    					ret += op.top(); ret += ' ';
    					op.pop();
    				}
    				op.pop(); i++;
    			} else if ('-' == src[i] || '+' == src[i]) {
    				while (!op.empty() && ('-' == op.top() || '+' == op.top())) {
    					ret += op.top(); ret += ' ';
    					op.pop();
    				}
    				op.push(src[i++]);
    			} else {
    				while (isdigit(src[i])) {
    					ret += src[i++];
    				}
    				ret += ' ';
    			}
    		}
    		while (!op.empty()) {
    			ret += op.top(); ret += ' ';
    			op.pop();
    		}
    		ret += '=';
    	}
    	inline int PostfixCalc() {
    		int n = ret.length();
    		for (int i = 0; i < n;) {
    			if (' ' == ret[i] || '=' == ret[i]) { i++; continue; }
    			if ('-' == ret[i] || '+' == ret[i]) {
    				int d1 = num.top(); num.pop();
    				int d2 = num.top(); num.pop();
    				num.push(calc(d1, d2, ret[i++]));
    			} else if (isdigit(ret[i])) {
    				int x = 0;
    				while (isdigit(ret[i])) {
    					x = x * 10 + ret[i++] - '0';
    				}
    				num.push(x);
    			}
    		}
    		return num.top();
    	}
    };
    class Solution {
    public:
    	int calculate(string s) {
    		if (s.empty()) return 0;
    		calc = new ExpCalc;
    		calc->InfixToPostfix(s);
    		int ans = calc->PostfixCalc();
    		return ans;
    	}
    private:
    	ExpCalc *calc;
    };
  • 相关阅读:
    【python】Excel从源表提取相应信息到目标表格
    Vue.config.productionTip 关闭生产提示
    [elementui]多行confirm
    [vue]防抖(debounce) 和 节流(throttling)
    C#的面向对象之继承与多态
    C#中接口与抽象类
    为iPhone开发iPad风格的弹出窗口
    新闻资讯APP开发流程(五) MainView.js
    titanium开发实例社交APP一之登录窗口
    titanium开发实例社交APP二之注册窗口
  • 原文地址:https://www.cnblogs.com/GadyPu/p/5020712.html
Copyright © 2011-2022 走看看