package org.lza;
/*
* 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
*/
/*
* 思路:看到题目后,我们发现运算的顺序是从左到右,碰到运算符号时,即对运算符号前面最近的两个数进行运行,即后面的数字反而先运算,让我们想起了栈,同时它们
* 的结果将可能作为下一次运算的数。
* 了解到这个规律后,我们可以用一个栈来存储数字,碰到运算符时输出栈顶前两个元素进行运算,运算完后将结果入栈
* 代码实现如下:
*/
public class EvaluateReversePolishNotation {
public static void main(String args[]){
Test();
}
public static void Test(){
String[] str={"4", "13", "5", "/", "+"};
System.out.println("运算字符串组为:");
for(String s:str)
System.out.print(s+",");
int result=EvaluateReversePolish(str);
System.out.println("结果为:"+result);
}
public static int EvaluateReversePolish(String[] str){
int result=0; //初始化结果为0
int num1=0,num2=0;//num2为第一运算数,num1为第二运算数
Stack stackNum=new Stack();//初始化栈 用来存储数字
for(int i=0;i<str.length;i++){
switch(str[i]){
case "+":
if(!stackNum.isEmpty()){//判断栈是否为空
num1=Integer.parseInt(stackNum.pop().toString());//将数字字符串转换为数字
num2=Integer.parseInt(stackNum.pop().toString());
}
result=num2+num1;//进行运算
stackNum.push(result);//结果入栈
break;//跳出循环
case "-":
if(!stackNum.isEmpty()){
num1=Integer.parseInt(stackNum.pop().toString());
num2=Integer.parseInt(stackNum.pop().toString());
}
result=num2-num1;
stackNum.push(result);
break;
case "*":
if(!stackNum.isEmpty()){
num1=Integer.parseInt(stackNum.pop().toString());
num2=Integer.parseInt(stackNum.pop().toString());
}
result=num2*num1;
stackNum.push(result);
break;
case "/":
if(!stackNum.isEmpty()){
num1=Integer.parseInt(stackNum.pop().toString());
num2=Integer.parseInt(stackNum.pop().toString());
}
result=num2/num1;
stackNum.push(result);
break;
default:
stackNum.push(str[i]);
}
}
return result;
}
};
class Stack {
private int LEN=10;//定义栈的初始大小
private Object[] elements;//定义栈的元素数组
private int top;//定义栈顶指针
//初始化栈
public Stack(){
top=-1;
elements=new Object[LEN];
}
//判断栈是否为空
public boolean isEmpty(){
return top<0;
}
//元素进栈
public void push(Object e){
if(elements.length+1>LEN)
expandStack();
elements[++top]=e;
}
private void expandStack(){
Object[] temp=new Object[elements.length*2];
for(int i=0;i<elements.length;i++){
temp[i]=elements[i];
}
LEN=elements.length*2;
elements=temp;
}
//元素出栈
public Object pop(){
if(isEmpty())
throw new StackEmptyException("错误,栈为空!");
Object e=elements[top];
elements[top--]=null;
return e;
}
}
class StackEmptyException extends RuntimeException{
public StackEmptyException(String err){
super(err);
}
}