Java 中缀转后缀

来源:互联网 发布:实时数据库软件有哪些 编辑:程序博客网 时间:2024/06/05 13:30
public class Test {/** * 一:非运算符直接输出 * 二:遇到左括号直接入栈 * 三:栈顶符号优先级高于或等于即将入栈的操作符,则将高于和等于的操作符出栈,然后再入栈 * 四:遇右括号,输出栈中的运算符,直到遇到第一个左括号,左括号出栈抛弃 * :乘除优先级相等》 加减优先级相等 *  * 中缀转后缀实例,支持10以内加减法 *  * */public static void main(String[] args) {String s="2+2*3/((2*(1+2)-4)*5)";char[]chars=s.toCharArray();Stack stack=new Stack<>();ArrayList list=new ArrayList<>();for(int i=0;i<chars.length;i++){char m=chars[i];//System.out.println(m);if(m!='+'&&m!='-'&&m!='*'&&m!='/'&&m!='('&&m!=')'){list.add(m);}else{if(stack.isEmpty()&&m!=')'){stack.push(m);}else{if(m==')'){/** * 清除一对括号 * */while((char)stack.peek()!='('){list.add(stack.pop());}stack.pop();}else if(m=='('){stack.push(m);}else{popContinue(m, stack, list);//最多执行两次,除了(左括号外,栈内不会有两个连续权限相等的符号}}}}while(!stack.isEmpty()){list.add(stack.pop());}System.out.println(list.toString());Stack res=new Stack();for(int i=0;i<list.size();i++){char m=(char)list.get(i);if(m!='+'&&m!='*'&&m!='-'&&m!='/'){res.push(Double.parseDouble(m+""));}else{double d1=0,d2=0;if(!res.isEmpty()){d1=(double) res.pop();}if(!res.isEmpty()){d2= (double) res.pop();}double d3 = 0;if(m=='*'){d3=d2*d1;}if(m=='+'){d3=d2+d1;}if(m=='-'){d3=d2-d1;}if(m=='/'){d3=d2/d1;}res.push(d3);}}System.out.println(res.pop());}public static void popContinue(char m,Stack stack,ArrayList list){int v1=getValues(m);int v2=getValues((char)stack.peek());if(v1>v2){stack.push(m);return ;}else{list.add(stack.pop());if(!stack.isEmpty()){popContinue(m, stack, list);}else{stack.push(m);}}}public static int getValues(char m){int i=0;if(m=='*'||m=='/'){i=2;}else if(m=='('){i=0;}else{i=1;}return i;}}