#Leet Code# Evaluate Reverse Polish Notation
描述:计算逆波兰表达法的结果
Sample:
- ["", "", "+", "", "*"] -> ((2 + 1) * 3) -> 9
- ["", "", "", "/", "+"] -> (4 + (13 / 5)) -> 6
使用stack实现:
- def is_op(c):
- return c in ['+', '-', '*', '/']
- def divide(x, y):
- if (x * y) < 0:
- return -1 * ((-x)/y)
- return x/y
- class Solution:
- # @param tokens, a list of string
- # @return an integer
- def evalRPN(self, tokens):
- opDict = {'+': lambda x,y: x+y,
- '-': lambda x,y: x-y,
- '*': lambda x,y: x*y,
- '/': divide}
- record = []
- for item in tokens:
- if is_op(item):
- second = record.pop()
- first = record.pop()
- record.append(opDict[item](first, second))
- else:
- record.append(int(item))
- return record[0]
使用树实现:
- def is_op(c):
- return c in ['+', '-', '*', '/']
- def divide(x, y):
- if (x * y) < 0:
- return -1 * ((-x)/y)
- return x/y
- class Tree:
- def __init__(self, data):
- self.data = data
- self.parent = None
- self.left = None
- self.right = None
- class Solution:
- # @param tokens, a list of string
- # @return an integer
- def __init__(self):
- self.opDict = {'+': lambda x,y: x+y,
- '-': lambda x,y: x-y,
- '*': lambda x,y: x*y,
- '/': divide}
- def builtTree(self, tokens):
- if not is_op(tokens[-1]):
- return int(tokens[-1])
- # if element is an operator
- cur_tree = Tree(tokens[-1])
- top_tree = cur_tree
- for item in tokens[-2::-1]:
- if cur_tree.right is None:
- if is_op(item):
- cur_tree.right = Tree(item)
- cur_tree.right.parent = cur_tree
- cur_tree = cur_tree.right
- else:
- cur_tree.right = int(item)
- if cur_tree.right and cur_tree.left:
- cur_tree = self.getUpperNode(cur_tree)
- continue
- if cur_tree.left is None:
- if is_op(item):
- cur_tree.left = Tree(item)
- cur_tree.left.parent = cur_tree
- cur_tree = cur_tree.left
- else:
- cur_tree.left = int(item)
- if cur_tree.right is not None and cur_tree.left is not None:
- cur_tree = self.getUpperNode(cur_tree)
- return top_tree
- # Move to upper node if cur node if full. If top_node return.
- def getUpperNode(self, node):
- while node.right is not None and node.left is not None:
- if node.parent is None:
- return node
- node = node.parent
- return node
- def getValue(self, node):
- if type(node) is type(1):
- return node
- else:
- return self.getResult(node)
- def getResult(self, treeNode):
- leftValue = self.getValue(treeNode.left)
- rightValue = self.getValue(treeNode.right)
- result = self.opDict[treeNode.data](leftValue, rightValue)
- return result
- def evalRPN(self, tokens):
- topNode = self.builtTree(tokens)
- if type(topNode) is type(1):
- return topNode
- else:
- resultNum = self.getResult(topNode)
- return resultNum
备注-1:if cur_node.right is None 不能用 if cur_node.right 因为cur_node.right 如果是数字0的话会有问题 当然 不转成int的话直接存string等到运算时再转int应该就可以这样写了
备注-2:python的除法跟c++不太一样 3/-5 = -1
结论:
根据问题的具体特性,选择合适的数据结构解决问题会差别很大
#Leet Code# Evaluate Reverse Polish Notation的更多相关文章
- 【leetcode】Evaluate Reverse Polish Notation
Evaluate Reverse Polish Notation 题目描述: Evaluate the value of an arithmetic expression in Reverse Pol ...
- [LintCode] Evaluate Reverse Polish Notation 计算逆波兰表达式
Evaluate the value of an arithmetic expression in Reverse Polish Notation. Valid operators are +, -, ...
- LeetCode: Reverse Words in a String:Evaluate Reverse Polish Notation
LeetCode: Reverse Words in a String:Evaluate Reverse Polish Notation Evaluate the value of an arithm ...
- 【LeetCode练习题】Evaluate Reverse Polish Notation
Evaluate Reverse Polish Notation Evaluate the value of an arithmetic expression in Reverse Polish No ...
- leetcode - [2]Evaluate Reverse Polish Notation
Evaluate Reverse Polish Notation Total Accepted: 24595 Total Submissions: 123794My Submissions Evalu ...
- 【LeetCode】150. Evaluate Reverse Polish Notation
Evaluate Reverse Polish Notation Evaluate the value of an arithmetic expression in Reverse Polish No ...
- LeetCode: Evaluate Reverse Polish Notation 解题报告
Evaluate Reverse Polish Notation Evaluate the value of an arithmetic expression in Reverse Polish No ...
- LeetCode 150. 逆波兰表达式求值(Evaluate Reverse Polish Notation) 24
150. 逆波兰表达式求值 150. Evaluate Reverse Polish Notation 题目描述 根据逆波兰表示法,求表达式的值. 有效的运算符包括 +, -, *, /.每个运算对象 ...
- 【LeetCode】150. Evaluate Reverse Polish Notation 解题报告(Python)
[LeetCode]150. Evaluate Reverse Polish Notation 解题报告(Python) 标签: LeetCode 题目地址:https://leetcode.com/ ...
随机推荐
- 关于no system images installed for this target解决方法
(1)国外网站都被屏蔽,连不上下载地址了 修改hosts文件(C:\Windows\System32\drivers\etc\hosts),在最后添加如下内容 127.0.0.1 localhost ...
- 在TextView使用部分颜色文字
/** * change a part of string color. * * @param string * whole string. * @param subString * the sub ...
- SQL Server 阻止了对组件 'Ole Automation Procedures' 的 过程 'sys.sp_OACreate' 的访问
sqlserver2008导入excel到数据库的时候报错: SQL Server 阻止了对组件 'Ole Automation Procedures' 的 过程 'sys.sp_OACreate' ...
- The 10 Most Important Security Controls Missing in JavaEE--reference
JavaEE has some excellent built-in security mechanisms, but they don’t come close to covering all th ...
- To Be NUMBER ONE
Problem Description One is an interesting integer. This is also an interesting problem. You are assi ...
- Windows下安装破解JIRA6.3.6
相关工具下载地址:http://pan.baidu.com/s/1kT9xZEJ 安装环境: WindowsXP MySQL-5.5.28 JDK1.6.0_21 JIRA功能全面,界面友好,安装简单 ...
- volatile的使用原则
为了防止无良网站的爬虫抓取文章,特此标识,转载请注明文章出处.LaplaceDemon/SJQ. http://www.cnblogs.com/shijiaqi1066/p/4352802.html ...
- Ubuntu GNOME 安装日语输入法(收集)
原网址是:code.duffy.jp/add-japanese-input-to-gnome/ 1)在终端(Ctrl + Alt + t)输入:sudo apt-get install ibus-an ...
- js一些算法实现
1.约瑟夫环实现 //附有调试 function joseph(n,p){ var arr=[]; for(var i=0;i<n;i++){ arr.push(i); } debugger; ...
- 无可匹敌的创建job(细化很多细节)
declare jobno binary_integer ; rm_days number := 15; --保留多少天的数据,单位天数 rm_hour ...