Java | 鏈表棧實現綜合計算器(中綴表達式)

棧(Stack)的理解

/*
 * 棧(Stack)
 *  1. 棧是先入後出(FILO-First In Last Out)的有序列表。
 *  2. 棧是限制線性表中元素的插入和刪除只能在線性表的同一端進行的一個特殊線性表。
 *     允許插入和刪除的一段,爲變化的一端,稱爲棧頂(Top),另一端爲固定的一端,稱爲棧底(Bottom)
 *  3. 根據棧的定義可知,最先放入棧中元素在棧底,最後放入的元素在棧頂,
 *     而刪除元素剛好相反,最後放入的元素最先刪除,最先放入的元素最後刪除。
 * 棧的應用場景
 *  1. 子程序的調用:在跳往子程序前,會先將下個指令的地址存到堆棧中,直到子程序執行完後
 *     再將地址取出,以回到原來的程序中
 *  2. 處理遞歸調用:和子程序的調用類似,只是除了存儲下一個指令的地址外,也將參數、區域
 *     變量等數據存入堆棧中
 *  3. 表達式的轉換[中綴表達式轉後綴表達式]與求值(實際解決)
 *  4. 二叉樹的遍歷
 *  5. 圖形的深度優先搜索法
 *
 * 實現棧的思路分析:
 *  1. 使用數組模擬棧
 *  2. 定義一個top來表示棧頂,初始化爲-1
 *  3. 入棧的操作,當有數據加入到棧時,top++; stack[top] = data;
 *  4. 出棧的操作,int value = stack[top]; top --; return value;
 *
 *
 * 使用棧完成表達式的計算思路
 * 1. 通過一個index值(索引),來遍歷表達式
 * 2. 如果是數字,就直接壓入棧
 * 3. 如果是符號,就分情況:
 *  3.1 如果當前的符號棧爲空,就直接入棧
 *  3.2 如果符號棧有操作符,就進行比較:
 *      3.2.1 如果當前的操作符的優先級小於或者等於棧中的操作符,就需
 *            要從數字棧中pop出兩個數,再從符號棧中pop出一個符號,進行運算,
 *            將得到的結果壓入數字棧,然後將當前的操作符壓入符號棧
 *      3.2.2 如果當前的操作符的優先級大於棧中的操作符,就直接壓入符號棧
 */
 */

效果圖

GitHub

https://github.com/Oh-MyBug/Calculator (代碼中有詳細註釋)
( 可以的話留下一個Star吧!謝謝!)

微信公衆號

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章