1. 程式人生 > >Java表示式求值

Java表示式求值

1、先讀取表示式,用字串存,比如字串“1+2+3”
2、將字串中的數字和運算子識別出來,按依次存在linkedlist裡面 ,就變成 了 1+2+3 (數字為integ型別,字串為#character型別),這就是中序表示式
3、將中序表示式 轉換成 後序表示式 存在另一個linkedlisi裡面
4、計算後序表示式的值
這裡寫圖片描述

本程式主要是理清表示式求值的方法,本程式 還存在一些小問題:不能識別 小數,負數,感興趣的可以自行修改程式

public class biaodashiqiuzhi_01 
{
       List zhongxu=new LinkedList();//儲存中序表示式
List houxu=new LinkedList();//儲存後續表示式 /* * 函式名:priority * 判斷操作符優先順序 * 大於返回1 等於返回0 小於返回 -1 */ public int priority(char a,char b)//判斷優先順序 { if (a=='+' || a=='-') switch (b) { case '+': case '-': return
0; default: return -1; } else switch (b) { case '+': case '-': return 1; case '*': case '/': return 0; default
: return -1; } } public void divide(String shizi)//識別字符串中的數字和字元 { int flag=0; double a=0;double j=0; for(int i=0;i<shizi.length();i++) { char c=shizi.charAt(i); //如果是操作符 if (c=='+' || c=='-' || c=='*' || c=='/' || c=='(' || c==')' ) { if (flag==1) //為了處理連續兩個操作符的情形,數字重複進入連結串列 zhongxu.add(a); zhongxu.add(c); flag=0; a=0; } else //如果是數字 { if(flag==0)//第一次讀到數字進行標記 flag=1; a=a*10+c-48; //數字進入連結串列依賴於身後的符號,但是數字後面沒有符號的時候,是一種特殊情況 if (i==shizi.length()-1) zhongxu.add(a); } } } public void MidTOBack()//中序表示式轉換成後續表示式 { Mystack temp=new Mystack(); for (Object object : zhongxu) { if (object instanceof Character) { if (object.equals('(')) //左括號 直接進入後續表示式 temp.push(object); else //右括號,則吧遇到左括號之前的操作符全部放到後續表示式中 if (object.equals(')') ) { while(!temp.getTop().equals('(')) houxu.add(temp.pop()); temp.pop(); } else if (temp.isEmpty()) temp.push(object); else if ( priority((char)object , (char)temp.getTop() ) >0) temp.push(object); else if (temp.getTop().equals('(')) temp.push(object); else { while(!temp.isEmpty() && !temp.getTop().equals('(') && priority((char)object , (char)temp.getTop() ) <1) houxu.add(temp.pop()); temp.push(object); } } else//數字 直接進入後續表示式 {houxu.add(object);} } while(!temp.isEmpty()) houxu.add(temp.pop()); } public void calulate()//計算後續表示式 { for (int i = 0; houxu.size()!=1; i++) { if (houxu.get(i) instanceof Character) { if(houxu.get(i).equals('+')) houxu.set(i-2, (Double)houxu.get(i-2)+(Double)houxu.get(i-1) ); if(houxu.get(i).equals('-')) houxu.set(i-2, (Double)houxu.get(i-2)-(Double)houxu.get(i-1) ); if(houxu.get(i).equals('*')) houxu.set(i-2, (Double)houxu.get(i-2)*(Double)houxu.get(i-1) ); if(houxu.get(i).equals('/')) houxu.set(i-2, (Double)houxu.get(i-2)/(Double)houxu.get(i-1) ); houxu.remove(i-1); houxu.remove(i-1); i-=2; } } System.out.println(houxu.get(0)); } public static void main(String[] args) { biaodashiqiuzhi_01 test=new biaodashiqiuzhi_01(); Scanner scanner=new Scanner(System.in); while(true) { String str=scanner.nextLine(); test.divide(str); test.MidTOBack(); test.calulate(); } } }