您的位置:首页 > 编程语言 > Lua

LeetCode -- Evaluate Reverse Polish Notation

2015-10-17 00:38 471 查看
题目描述:

Evaluate the value of an arithmetic expression in Reverse Polish Notation.

Valid operators are +, -, *, /. Each operand may be an integer or another expression.

Some examples:
  ["2", "1", "+", "3", "*"] -> ((2 + 1) * 3) -> 9
  ["4", "13", "5", "/", "+"] -> (4 + (13 / 5)) -> 6

算是一个经典题目,就是执行一个逆波兰表达式。

思路:
1. 使用操作符栈,操作数栈。
解析tokens的过程中,如果token[i]是操作符:
a. 操作数栈中没有元素,操作符入栈
b. 操作数栈有元素,弹出最上两个与该操作符计算,结果入操作数栈

2. 如果token[i]操作数,直接入操作数栈
3. 如果解析完毕后,操作符栈还有操作符,一一弹出并计算(弹1个操作符,两个操作数),结果入操作符栈
4. 弹出操作符栈的最后元素,即为计算结果。

public class Solution {
public int EvalRPN(string[] tokens)
{
var stNo = new Stack<int>();
var stOp = new Stack<char>();

for(var i = 0;i < tokens.Length; i++){
if(IsOp(tokens[i])){
if(stNo.Count == 0){
stOp.Push(tokens[i][0]);
}
else{
var n1 = stNo.Pop();
var n2 = stNo.Pop();
stNo.Push(Calc(n1, n2, tokens[i][0]));
}
}
else{
stNo.Push(int.Parse(tokens[i]));
}
}

while(stOp.Count > 0){
var op = stOp.Pop();
var n1 = stNo.Pop();
var n2 = stNo.Pop();
stNo.Push(Calc(n1, n2, op));
}

return stNo.Pop();
}

private int Calc(int n1 , int n2, char op)
{
switch(op)
{
case '+':
return n2 + n1;
case '-':
return n2 - n1;
case '*':
return n2 * n1;
case '/':
return n2 / n1;
default:
throw new NotSupportedException();
}
}

private bool IsOp(string str)
{
if(str == "+" || str == "-" || str == "*" || str == "/")
{
return true;
}

return false;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: