JAVA实现逆波兰转换,java实现逆波兰式

package com.yj.rpn;

import java.util.*;

import java.util.logging.StreamHandler;

/**

* Created by yanjie on 17/10/31.

* 逆波兰式

* 使用到的符号

* #

* +-

* *\\/

* () 括号比较特殊

*/

public class RPN {

private Map sy = new HashMap();

public RPN(){

sy.put("#",0);

sy.put("(",0);

sy.put(")",0);

sy.put("+",1);

sy.put("-",1);

sy.put("*",2);

sy.put("/",2);

}

private Stack s1 = new Stack();

private Stack s2 = new Stack();

public String getRpn(String s){

s1.add("#");

Boolean pre = false;

for(int i=0; i

char c = s.charAt(i);

//识别操作数

String t = "";

while(i

t = t + c;

if(++i>=s.length()){

break;

}

c = s.charAt(i);

}

if(!t.equals("")){

s2.add(t);

}

if(i>=s.length()){

break;

}

switch (c){

case '('://取出的字符是“(”,则直接送入S1栈顶

s1.add(c+"");

break;

case ')'://取出的字符是“)”,则将距离S1栈栈顶最近的“(”之间的运算符,逐个出栈,依次送入S2栈,此时抛弃“(”

t = s1.pop();

while(!t.equals("(")){

s2.add(t);

t = s1.pop();

}

break;

default:

String s1c = s1.peek();

//当前运算符优先级大于s1栈顶优先级,运算符存入s1

if(sy.get(c+"")>sy.get(s1c)){

s1.add(c+"");

}else{//将S1栈的栈顶运算符弹出,送入S2栈中,直至S1栈栈顶运算符低于(不包括等于)该运算符优先级,最后将该运算符送入S1栈

while(sy.get(s1c)>=sy.get(c+"")){

s1c = s1.pop();

s2.add(s1c);

}

s1.add(c+"");

}

}

}

String t = s1.pop();

while(!t.equals("#")){

s2.add(t);

t = s1.pop();

}

String result = "";

while(s2.size()>0){

result = s2.pop() +" "+ result;

}

return result;

}

//main method

public static void main(String[] args) {

RPN rpn = new RPN();

String result = rpn.getRpn("1+2*3");

System.out.println(result);

result = rpn.getRpn("(1+2)*3");

System.out.println(result);

result = rpn.getRpn("(a+cc)*3");

System.out.println(result);

}

}