zoukankan      html  css  js  c++  java
  • 逆波兰表达式求值

    题目信息

    根据逆波兰表示法,求表达式的值。
    有效的运算符包括 +, -, *, / 。每个运算对象可以是整数,也可以是另一个逆波兰表达式。
    说明:
    整数除法只保留整数部分。    
    给定逆波兰表达式总是有效的。换句话说,表达式总会得出有效数值且不存在除数为 0 的情况。
    示例 1:
        输入: ["2", "1", "+", "3", "*"]
        输出: 9
        解释: ((2 + 1) * 3) = 9
    示例 2:
        输入: ["4", "13", "5", "/", "+"]
        输出: 6
        解释: (4 + (13 / 5)) = 6
    示例 3:
        输入: ["10", "6", "9", "3", "+", "-11", "*", "/", "*", "17", "+", "5", "+"]
        输出: 22
        解释: 
         ((10 * (6 / ((9 + 3) * -11))) + 17) + 5
        = ((10 * (6 / (12 * -11))) + 17) + 5
        = ((10 * (6 / -132)) + 17) + 5
        = ((10 * 0) + 17) + 5
        = (0 + 17) + 5
        = 17 + 5
        = 22

    解题思路

    从题目描述可以看出,其实就是表达式的方式,只不过先输入两个数字,再输入操作符
    也是模拟栈的方式,判断如果是数字进栈,如果是操作符,取出栈中的前两个元素,进行该
    操作的的操作即可

    代码

    class StackInt {
        var array = [Int]();
        
        func pop() -> Int {
            if array.isEmpty {
                return 0;
            }
            return array.removeLast();
        }
        
        func push(num: Int) -> Void {
            array.append(num);
        }
        
        func top() -> Int {
            if array.isEmpty {
                return 0;
            }
            return array.last!;
        }
        
    }
    
    /// 逆波兰表达式求值
    func evalRPN(_ tokens: [String]) -> Int {
        let stack = StackInt();
        var sum = 0;
        for string: String in tokens {
            if "+-*/".contains(string) {
                let right = stack.pop();
                let left = stack.pop();
                switch string {
                case "+":
                    sum = left + right;
                    stack.push(num: sum);
                    break;
                case "-":
                    sum = left - right;
                    stack.push(num: sum);
                    break;
                case "*":
                    sum = left * right;
                    stack.push(num: sum);
                    break;
                case "/":
                    sum = left / right;
                    stack.push(num: sum);
                    break;
                default:
                    break
                }
            } else {
                stack.push(num: Int(string)!);
            }
        }
        return stack.pop();
    }

    题目链接

  • 相关阅读:
    Delphi
    delphi trayIcon控件,如何实现窗口最小化的时候到系统托盘
    delphi2010自带 TTrayIcon 托盘图标控件使用方法
    通过例子来简单了解下TProgressBar的使用。 pas文件程序如下
    ORA-12154,ORA-12560解决过程
    博客备份小工具3
    各大招聘网站信息实时查询浏览
    IE7中使用Jquery动态操作name问题
    js问题杂记
    动态sql
  • 原文地址:https://www.cnblogs.com/muzichenyu/p/12809607.html
Copyright © 2011-2022 走看看