中缀表达式转后缀并计算(只考虑个位整数,不考虑除0等情况)
Posted 就是干不掉我
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了中缀表达式转后缀并计算(只考虑个位整数,不考虑除0等情况)相关的知识,希望对你有一定的参考价值。
中缀转后缀
public class 中缀转后缀 { static char[] res;//存储结果 static int len_r=0; static char[] stack;//操作符栈 static int len_s=0; public static String transfer(String s){ res=new char[s.length()]; stack=new char[s.length()]; char[] ch=s.toCharArray(); for(int i=0;i<ch.length;++i){ //数字直接输出到结果 if(ch[i]>=‘0‘&&ch[i]<=‘9‘){ res[len_r++]=ch[i]; }else{ //右括号:操作符出栈输出到结果,直到遇到左括号(左括号出栈但不输出到结果) if(ch[i]==‘)‘){ while(len_s>0&&stack[--len_s]!=‘(‘){ res[len_r++]=stack[len_s]; } }else{ //左括号直接进操作符栈 if(ch[i]==‘(‘){ stack[len_s++]=ch[i]; }else{ //操作符出栈输出到结果,直到遇到自己的位置。 int index=getIndex(ch[i]); while(len_s>index){ res[len_r++]=stack[--len_s]; } stack[len_s++]=ch[i]; } } } } while(--len_s>=0){ res[len_r++]=stack[len_s]; } return new String(res,0,len_r); } /* * 如果是*或/,遇到(、+、-、空 进栈 * 如果是+或-,遇到(、空 进栈 * */ static int getIndex(char ch){ int index=0; boolean flag=true; if(ch==‘+‘||ch==‘-‘){ flag=false; } for(int i=len_s-1;i>=0;--i){ if(flag&&(stack[i]==‘(‘||stack[i]==‘+‘||stack[i]==‘-‘)){ index=i+1; break; } if(!flag&&stack[i]==‘(‘){ index=i+1; break; } } return index; } }
计算后缀表达式
public class 计算后缀表达式 { public static int doCompute(String s){ char[] ch=s.toCharArray(); int[] stack=new int[s.length()]; int len=0; for(int i=0;i<ch.length;++i){ //数字进栈;遇到操作符ch,出栈两个数a,b(a先出),把b ch a的结果进栈。最后输出栈顶元素。 if(ch[i]>=‘0‘&&ch[i]<=‘9‘){ stack[len++]=ch[i]-‘0‘; }else{ int a=stack[--len]; int b=stack[--len]; stack[len++]=compute(a,b,ch[i]); } } return stack[0]; } static int compute(int b,int a,char ch){ int res=0; switch(ch){ case ‘+‘: res=a+b; break; case ‘-‘: res=a-b; break; case ‘*‘: res=a*b; break; case ‘/‘: res=a/b; break; } return res; } }
以上是关于中缀表达式转后缀并计算(只考虑个位整数,不考虑除0等情况)的主要内容,如果未能解决你的问题,请参考以下文章