突然之間心血來潮,就是想試一試資料結構怎麼用.到現在才感覺的,資料結構是一種思想,一種思維方式,用怎樣的方式去解決怎樣的問題,這些是資料結構和演算法給我們的.
言歸正傳吧,說說這個小計算器(其實還有太多需要擴充套件和改進的地方).暫時只侷限在加減乘除,因為定義的是int型別的,所以也限制在整數運算吧.
主要思路是這樣的:計算器最主要的部分是獲取使用者輸入,然後根據演算法將獲取到的輸入儲存成為二叉樹.當然,肯定要用棧儲存的.
先看一下簡單的分析:
1+2-3: 儲存成二叉樹應該是這樣的:節點上的值為運算子,左右孩子為數值:
+ 3
1 2
也就是說,存好後用後序方法來進行讀取,然後計算.
如果有*和/,則如下:
1+2*3-6/2:
1 * 6 2
2 3
其實,從這些分析上,可以得出乙個結論,暫且是對於這個計算器範圍內的結論(沒有括號之類的...)
(1)兩個棧,乙個ctack,用來存放暫時的操作符,乙個ttack,用來存放二叉樹.兩個棧結構,乙個棧存放的是string型別,另乙個存放二叉樹node型別.
(2)一次對使用者輸入的字元進行遍歷,通過下面的原則判斷是否壓棧還是出棧組成二叉樹.
方式:首先,在輸入字元是數字時,先建立乙個ttack,左右孩子賦值為null,data值賦值為數字.
輸入遍歷到操作符時:a: ctack為空;b:ctack當前操作符優先順序《讀入的操作符 ; 壓棧ctack
aa:ctack當前操作符優先順序》=讀入操作符優先順序,新建node,出棧ttack中的兩個node分別
作為新node的左右孩子,操作符作為節點值,之後再次壓棧ttack.
(3)讀完後,如果ctack還不是null,則以此取出ttack中的兩個node作為新node的左右孩子,ctack出棧的操作符作為節點值.之後壓棧.
思路大體就是這樣,這個過程中其實有很多問題,其中比較難的是:如果操作符和已經有的是相等的關係,那麼就是迴圈進行新建節點,壓棧這些操作.
核心程式:
package com.pipi.mainprocess;
import com.pipi.structure.node;
import com.pipi.structure.operatorstacks;
import com.pipi.structure.stacks;
import com.pipi.util.checkpriority;
import com.pipi.util.operate;
public class structure
}else
ctack.push(string.valueof(cc[i]));}}
while(ctack.getpoint() > 0)
//計算最後的值
int result = operate.getresult(ttack.pop());
/*** 遍歷二叉樹元素,得出結果後沒有用啦
*/int j = ttack.getpoint(); //當前棧中的個數
for(int i = 0; i < j; i++)
/*** 遍歷操作符,最後沒有了
*/int k = ctack.getpoint();
for(int i = 0; i < k; i++)
// return "";
return result+"";
}}
對棧的操作:
package com.pipi.structure;
public class operatorstacks
return "###"; }
public string pop()
return sb[point];
}public void push(string n)
public int getpoint()
public void setpoint(int point)
public string getsb()
public void setsb(string sb)
}
工具操作:其中getresult方法用到了遞迴呼叫的方法.
package com.pipi.util;
import com.pipi.structure.node;
import com.pipi.structure.operatorstacks;
import com.pipi.structure.stacks;
/** * 兩個數之間的計算
* @author ya皮皮
* */
public class operate else if(str.equals("-"))else if(str.equals("*"))else
return 0+"";}}
/***
* @param ttack
* @param ctack
* @return
*///計算
public static int getresult(node n)else
return integer.parseint(result);
} /**
* 判斷是不是操作符
*/public static boolean isoperate(string str)
}
定義優先順序:
public class checkpriority
if(s.equals("*") || s.equals("/"))else if(s.equals("+") || s.equals("-"))else
}}
定義二叉樹:
package com.pipi.structure;
/** *
* @author pipi
* 定義二叉樹
*/public class node
public void setdata(string data)
public node getlchild()
public void setlchild(node lchild)
public node getrchild()
public void setrchild(node rchild)
}
總結:
其實,這個程式只是實現了乙個思想,還有很多沒有考慮到的地方,還有很多**需要重構.總的來說,學會了這種思想也是乙個小小的進步,接下來會好好完善一下**.
gogo~
用Java實現計算器
在學習 資料結構 這門課的時候,老是會想到模擬計算器的運算。雖說實驗裡面也有設計逆波蘭計算器的題目,但它只考察了棧和佇列的操作思想,沒有考慮到運算子的優先順序以及複雜組合情況 比如多層括號 因此其實用性並不大。今天試著寫了一下,看似很簡單,還是花費了一段時間的。這是最簡單的情況。1.首先 的運算等級...
實現乙個計算器
一直以來,我都想寫一門語言,但無從下手。我找到了很多編譯原理的教程,但始終覺得內容晦澀,理解不了,所以先嘗試寫乙個簡單的,比如 計算器。網上有很多關於計算器的實現,但大多需要有編譯原理的基礎,對於我這種小白實在難以理解。我決定採用暴力模擬的方式,需要用正規表示式,但我不想自己實現,所以用js。計算器...
實現乙個計算器
一直以來,我都想寫一門語言,但無從下手。我找到了很多編譯原理的教程,但始終覺得內容晦澀,理解不了,所以先嘗試寫乙個簡單的,比如 計算器。網上有很多關於計算器的實現,但大多需要有編譯原理的基礎,對於我這種小白實在難以理解。我決定採用暴力模擬的方式,需要用正規表示式,但我不想自己實現,所以用js。計算器...