中綴表達式轉後綴並計算(只考慮個位整數,不考慮除0等情況)
阿新 • • 發佈:2018-05-26
sta put AS res r+ ring 位置 while AC
中綴轉後綴
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等情況)