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

LeetCode:Evaluate Reverse Polish Notation

2014-03-18 16:25 309 查看
LeetCode的第二道,计算逆波兰式。
大二上的时候老师就讲过逆波兰式这个东西,平常我们做的运算,即中缀表达式。首先将中缀表达式转化为后缀表达式(逆波兰式)再又堆栈进行处理,十分的方便,我也是做了这道题后才深有感触。
逆波兰表达式,它的语法规定,表达式必须以逆波兰表达式的方式给出。逆波兰表达式又叫做后缀表达式。这个知识点在数据结构和编译原理这两门课程中都有介绍,下面是一些例子:
正常的表达式 逆波兰表达式
a+(b-c)*d ---> a,b,c,-,d,*,+
a+d*(b-c)--->a,d,b,c,-,*,+
http=(smtp+http+telnet)/1024 写成什么呢?
http=smtp,http,+,telnet,+,1024,/

优势
它的优势在于只用两种简单操作,入栈和出栈就可以搞定任何普通表达式的运算。其运算方式如下:
如果当前字符为变量或者为数字,则压栈,如果是运算符,则将栈顶两个元素弹出作相应运算,结果再入栈,最后当表达式扫描完后,栈里的就是结果。

将中缀表达式换算成逆波兰式比较复杂,我这里只说明一般算法。
将一个普通的中序表达式转换为逆波兰表达式的一般算法是:
(1)首先构造一个运算符栈,此运算符在栈内遵循越往栈顶优先级越高的原则。
(2)读入一个用中缀表示的简单算术表达式,为方便起见,设该简单算术表达式的右端多加上了优先级最低的特殊符号“#”。
(3)从左至右扫描该算术表达式,从第一个字符开始判断,如果该字符是数字,则分析到该数字串的结束并将该数字串直接输出。
(4)如果不是数字,该字符则是运算符,此时需比较优先关系。
做法如下:将该字符与运算符栈顶的运算符的优先关系相比较。如果,该字符优先关系高于此运算符栈顶的运算符,则将该运算符入栈。倘若不是的话,则将栈顶的运算符从栈中弹出,直到栈顶运算符的优先级低于当前运算符,将该字符入栈。
(5)重复上述操作(3)-(4)直至扫描完整个简单算术表达式,确定所有字符都得到正确处理,我们便可以将中缀式表示的简单算术表达式转化为逆波兰表示的简单算术表达式。

import java.util.Stack;

public class Solution {
public int evalRPN(String[] tokens) {
Stack<Integer> number = new Stack<Integer>();     //整数栈存放数字
for(int i=0;i<tokens.length;i++){
if(!tokens[i].equals("+")&&!tokens[i].equals("-")&&!tokens[i].equals("*")&&!tokens[i].equals("/")){
number.push(Integer.valueOf(tokens[i]));    //将操作数压入栈中
}
else
{
int op = 0;
int op2=number.peek();    //将aXb的的后面那个操作数b取出
number.pop();
int op1=number.peek();   ////将aXb的的后面那个操作数a取出
number.pop();
if(tokens[i].equals("+")){ op=op1+op2;}
if(tokens[i].equals("-")){op=op1-op2;}
if(tokens[i].equals("*")){op=op1*op2;}
if(tokens[i].equals("/")){ op=op1/op2;}
number.push(op);    //栈顶元素即我们想要的结果
}
}
return number.peek();
}

}

这道题我有个重要的地方忘了,即equals()方法和“==”号的区别。在我电脑上运行时运行结果一直没有问题,但在OJ上一直格式错。
1.基本数据类型,也称原始数据类型。byte,short,char,int,long,float,double,boolean

他们之间的比较,应用双等号(==),比较的是他们的值。

2.复合数据类型(类)
当他们用(==)进行比较的时候,比较的是他们在内存中的存放地址,所以,除非是同一个new出来的对象,他们的比较后的结果为true,否则比较后结果为false。JAVA当中所有的类都是继承于Object这个基类的,在Object中的基类中定义了一个equals的方法,这个方法的初始行为是比较对象的内存地址,但在一些类库当中这个方法被覆盖掉了,如String,Integer,Date在这些类当中equals有其自身的实现,而不再是比较类在堆内存中的存放地址了。
所以比较基本数据类型是equals跟==没有区别,但比较复合数据类型是,equals()被重写了。
JDK类中有一些类覆盖了oject类的equals()方法,比较规则为:如果两个对象的类型一致,并且内容一致,则返回true,这些类有:

java.io.file,java.util.Date,java.lang.string,包装类(Integer,Double等)。

所以字符串及复合数据类型判断相等时,尽量要用equals();
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: