1. 程式人生 > >演算法-藍橋杯-演算法訓練 表示式計算 (JAVA)

演算法-藍橋杯-演算法訓練 表示式計算 (JAVA)

1 引言

什麼題。。。

2 題目

問題描述

  輸入一個只包含加減乖除和括號的合法表示式,求表示式的值。其中除表示整除。輸入格式  輸入一行,包含一個表示式。輸出格式  輸出這個表示式的值。樣例輸入1-2+3*(4-5)樣例輸出-4資料規模和約定  表示式長度不超過100,表示式運算合法且運算過程都在int內進行。

3 原始碼

import java.util.*;

public class Main {

    public static void main(String[] args) {
        Stack od=new Stack();//數字棧
        Stack op=new Stack();//符號棧
        Scanner sc=new Scanner(System.in);
        String str=sc.nextLine();

        int index=0;//記錄已經執行的符號數
        int length=str.length();
        //System.out.println(length);
        while(index<length)
        {
            //System.out.println("第"+index+"步++++++++++");
            char c=str.charAt(index);//取出這一步的符號
            if(c=='(')
            {
                //System.out.println(c+"-------進棧");
                op.push(c);//若是左括號就進棧
            }
            //否則要先判斷優先順序
            else if(c=='+' || c=='-' || c=='*'|| c=='/')
            {
                int currOplevel=getOplevel(c);//當前符號的優先順序
                while(true)
                {
                    int stackOplevel=0;//棧頂元素的優先順序
                    if(op.isEmpty()==false)
                    {
                        Object obj=op.peek();
                        stackOplevel=getOplevel((char)obj);
                    }
                    //若當前元素優先順序大於棧頂元素的優先順序則入棧
                    if(currOplevel>stackOplevel)
                    {
                    //  System.out.println(c+"-------進棧");
                        op.push(c);
                        break;//直到讓比自己優先順序高的符號都出棧運算了再把自己進棧
                    }
                    else//不能入棧就進行計算
                    {
                        try{
                            char optemp='0';
                            int odnum1=0;
                            int odnum2=0;
                            if(op.isEmpty()==false)
                            {
                                optemp=(char)op.pop();//取出優先順序大的那個符號
                            }
                            if(od.isEmpty()==false)
                            {
                                 odnum1=(int)od.pop();
                                 odnum2=(int)od.pop();//取出資料棧中的兩個數
                            }
                        //  System.out.println(optemp+" "+odnum1+" "+odnum2);
                            //System.out.println(cacuResult(optemp,odnum2,odnum1)+"-------進棧");
                            od.push(cacuResult(optemp,odnum2,odnum1));//將算出來的結果資料再次入資料棧
                        }catch(Exception e){
                            //System.out.println("多項式不正確1"+str+" "+c);
                            e.printStackTrace();
                        }
                    }
                }
            }else if(c==')')//右括號就返回找棧頂元素,右括號是不進棧的
            {
                while(true)
                {
                    char theop=(char)op.pop();
                    if(theop=='(')
                    {
                        break;
                    }
                    else
                    {
                        try{
                            int odnum1=(int)od.pop();
                            int odnum2=(int)od.pop();
                            //System.out.println(" "+odnum1+" "+odnum2);
                            //System.out.println(cacuResult(theop,odnum2,odnum1)+"-------進棧");
                            od.push(cacuResult(theop,odnum2,odnum1));//運算括號內的內容

                        }catch(Exception e)
                        {
                            //System.out.println("多項式不正確2"+str);
                            e.printStackTrace();
                        }
                    }
                }
            }else if(c>='0' && c<='9')
            {
                int tempindex=index+1;
                while(tempindex<length)
                {
                    char tempc=str.charAt(tempindex);//取字串中處於當前字元的下一位
                    if(tempc>='0'  && tempc<='9')
                    {
                        tempindex++;//若為數字則繼續向後取
                    }
                    else
                    {
                        break;//證明數字取完
                    }
                }
                String odstr=str.substring(index,tempindex);//擷取這個字串則為兩個符號之間的數字
                //System.out.println("---------"+odstr+"------------");
                try{
                    int odnum=Integer.parseInt(odstr);//將數字轉化成整型便於運算
                    //System.out.println(odnum+"-------進棧");
                    od.push(odnum);
                    index=tempindex-1;
                }catch(Exception e)
                {
                    //System.out.println("多項式不正確3"+str);
                    e.printStackTrace();
                }
            }
            index++;
        }
        //檢查op棧是否為空
        while(true)
        {
            Object obj=null;
            if(op.isEmpty()==false)
            {
             obj=op.pop();
            }
            if(obj==null)
            {
                break;//為空證明運算已結束
            }
            else//不為空就出棧運算
            {
                char optemp=(char)obj;
                int odnum1=(int)od.pop();
                int odnum2=(int)od.pop();
            //  System.out.println(cacuResult(optemp,odnum2,odnum1)+"-------進棧");
                od.push(cacuResult(optemp,odnum2,odnum1));
            }
        }
        int result=0;
        try{
            result=(int)od.pop();
        }catch(Exception e)
        {
            //System.out.println("多項式不正確4"+str);
            e.printStackTrace();
        }
        System.out.println(result);
    }

        //計算加減乘除餘
        public static int cacuResult(char op,int od1,int od2)
        {
            switch(op)
            {
            case '+':return od1+od2;
            case '-':return od1-od2;
            case '*':return od1*od2;
            case '/':return od1/od2;
            }
            return 0;
        }

        //返回符號優先順序
        public static int getOplevel(char op)
        {
            switch(op)
            {
            case '(':return 0;
            case '+':
            case '-':return 1;
            case '*':
            case '/':return 2;
            default:return 0;
            }
        }
}

4 結束語

    分享和幫助是人生一大樂事,希望可以幫助您。本人才疏學淺,如果有不當之處,還請批評指正。同時歡迎大家評論、點贊及轉發!