java實現中綴表示式轉字尾表示式並且計算
阿新 • • 發佈:2019-01-08
自己寫一個棧 用陣列實現
package cn.itcast.StackAndQuen; import java.util.ArrayList; import java.util.List; import java.util.Scanner; /** * Created by likailong on 2016/10/16. * 中綴表示式到字尾表示式 */ public class MathCaculate { public static void main(String [] args){ Scanner san=new Scanner(System.in);//鍵盤讀入 List<Character> list=new ArrayList<>();//將中綴表示式變成字尾表示式用陣列儲存 String input = san.next();//得到輸入的資訊 char[] shuju = input.toCharArray();//輸入的所有資訊放入char數組裡 int priority=0;//標記符號的的優先順序 MyStack<Character>mystack=new MyStack<>();//符號優先順序棧 MyStack<Integer>caculatestack=new MyStack<>();//計算字尾表示式棧 for(int i=0;i<shuju.length;i++){//達到鍵盤輸入的每個資料 if(getPriority(shuju[i])!=0){//的到每個資料的優先順序 if(getPriority(shuju[i])>=priority){//如果得到的是個運算子 與棧頂優先順序比較 priority=getPriority(shuju[i]);//如果大於等於棧頂優先順序 入棧 反之出棧 mystack.push(shuju[i]); } else{ while (!mystack.isEmpty()){//出棧操作 char num=mystack.pop(); list.add(num); System.out.print(num); } mystack.push(shuju[i]); } }else{ System.out.print(shuju[i]);//如果是數字直接輸出 用陣列接收 list.add(shuju[i]); } } char num1=mystack.pop();//得到棧中最後一個符號 輸出 System.out.print(num1); list.add(num1);//存入陣列 System.out.println(); for(int i=0;i<list.size();i++){//運算方法 把存在陣列中的字尾表示式遍歷 String nums=list.get(i).toString();//每個元素轉換成字串方便後面的Integer.parseInt(nums); char num=list.get(i); if('0'<=num&&num<='9'){//字串比較應該這麼寫 int numss=Integer.parseInt(nums);//字串轉數字 caculatestack.push(numss);//入棧 }else { int shuju1=caculatestack.pop();//出棧 int shuju2=caculatestack.pop(); char caculate=list.get(i); int numadd=0; if(caculate=='+'){//判斷陣列中的運算子 執行相關操作 numadd=shuju1+shuju2; }else if(caculate=='-'){ numadd= shuju2-shuju1; }else if(caculate=='*'){ numadd= shuju1*shuju2; }else if(caculate=='/'){ numadd=shuju1/shuju2; } caculatestack.push(numadd); } } System.out.println(caculatestack.pop());//得到棧頂元素及就是答案 } private static int getPriority(char shuju) {//的輸入的每個字元的優先順序 int priority=0; char num=shuju; if(0<=num&&num<=9){ }else { switch (num){ case '-': case '+': return priority=1; case '/': case '*': return priority=2; case '(': case ')': return priority=3; default:priority=0; } } return priority; } }
package cn.itcast.StackAndQuen; /** * Created by likailong on 2016/10/6. * 自定義棧的儲存結構 用陣列實現比較簡單 */ public class MyStack<T> { private T arr[]; private int top; public MyStack(){ top=-1; arr=(T[])new Object[10];//建立棧的大小 預設 } public MyStack(int maxSize){//構造方法的過載 建立指定的棧的大小 top=-1;//因為棧操作在操作頂層 先進後出 指標初始為-1 arr=(T[])new Object[maxSize]; } public void push(T value){ arr[++top]=value; }//入棧操作 指標下移動 public T pop(){return arr[top--];//top指標上移動 及就是pop推出元素並且刪除 } public T peek(){ return arr[top]; }//查詢某個元素 public boolean isEmpty(){ return top==-1; }//判斷棧是否為空 判斷top指標是否改變就可 public boolean isFool(){ return top==arr.length-1; }//判斷棧是否滿 及就是top指標是否是棧的長度-1 因為陣列從0開始 }