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;
    };
  • 相关阅读:
    STM32 HAL库学习笔记
    嵌入式Linux学习笔记
    AVR_Interrupt
    shutdown命令用法
    ULINK2 USB电脑无法识别(连接电脑后,设备管理器显示未知设备)
    MDK中编译程序后Program Size详解
    Keil(MDK-ARM)系列教程(三)_工程目标选项配置(Ⅰ)
    第48章 MDK的编译过程及文件类型全解
    Do not access Object.prototype method ‘hasOwnProperty’ from target object no-prototype-builtins
    让vscode按照eslint进行格式化
  • 原文地址:https://www.cnblogs.com/GadyPu/p/5020712.html
Copyright © 2011-2022 走看看