1. 程式人生 > >java實現中綴表示式轉字尾表示式並且計算

java實現中綴表示式轉字尾表示式並且計算

自己寫一個棧 用陣列實現

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開始

}