java中缀转后缀_Java 中缀转后缀

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

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

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;

}

}

表情包
插入表情
评论将由博主筛选后显示,对所有人可见 | 还能输入1000个字符
相关推荐
©️2020 CSDN 皮肤主题: 1024 设计师:白松林 返回首页