「棧」與「佇列」呢點事(二)

2021-09-24 07:43:39 字數 1894 閱讀 1365

攻無不克,「棧」無不勝。

知彼知己,百「棧」不殆。

本文分享了一下棧的實現原理,以及乙個簡單的應用場景-簡易計算器。

所有原始碼均已上傳至github:鏈結

public arraystack(int capacity) 複製**

public boolean push(int num) 複製**

public int pop

() 複製**

ps:按數字大小順序壓棧

鏈式棧則不需要像陣列呢樣在過載的構造方法初始化,直接宣告即可

public void push(int num) 

head = node;

}複製**

public int pop

() 複製**

本次基於棧的簡易計算器僅包含加減乘除等四則元素,比如計算 7-1+2*3+12/2。對於這個運算來講 ,只是就是乙個表示式求值的過程,對人來講,口算都能算出來,可是對計算機來講,這個表示式很難理解,具體應該怎麼實現呢?

規則:這裡和常規數**算符一樣,先乘除後加減,不包含括號,輸入值為正整數。

1.我們可以把該運算通過宣告兩個棧來實現。乙個棧valstack用來儲存值,乙個棧calstack用來儲存運算子。

process中的for迴圈從左往右依次遍歷,當遇到數字的時候入棧valstack,遇到運算子的時候,先別忙入棧calstack,要先與棧b的棧頂元素進行比較,如果比棧頂元素優先順序高,則入棧calstack,如果優先順序低或者相同,則從棧valstack裡取兩個值,然後進行計算,再壓入棧valstack。

當for迴圈執行完畢的時候,valstack棧的值的數量應該是比calstack的值得數量多一。

在while迴圈裡將剩餘的操作做完,直到一方為空。

最後清空棧即可。

public void process(string str)  else 

print();

} while (!valstack.isempty() && !calstack.isempty())

valstack.clear();

calstack.clear();

}複製**

2.該方法就是當遇到操作符時開始判斷是入棧還是計算

private void caldeal(string opt) else 

}} if (calstack.isempty())

}複製**

3.計算方法

private integer calulate(string opt, integer p, integer q) 

return null;

}複製**

4.比較操作符的優先順序

private boolean compareoperator(string curcal, string tarcal) 

return

true;

case

"*":

case

"/":

return

false;

default:

break;

} return

true;

}複製**

ps:該測試結果同時也將兩個棧的變化列印出來,一目了然

您的點讚和關注是對我最大的支援,謝謝!

棧與佇列知識點

一 讀取 include include 棧的標頭檔案 using namespace std intmain 輸入 123 輸出 123 二 刪除 include include 棧的標頭檔案 using namespace std intmain 輸入 123 456 輸出 123 三 判斷棧的...

棧與佇列 建立棧 佇列

陣列棧 完成stack createstack int maxelements 函式,該函式建立乙個棧,maxelements為與分配的棧空間大小 棧可用空間為array 0,maxelements 1 typedef int elemtype struct stackrecord typedef ...

資料結構(二) 棧棧與佇列

棧 stack 是限制插入和刪除只能在乙個位置上進行的表,該位置是表的末端,叫做棧頂 top 它是後進先出 lifo 的。對棧的基本操作只有push 進棧 和pop 出棧 兩種,前者相當於插入,後者相當於刪除最後的元素。實現 利用乙個單鏈表來實現棧的資料結構。而且,因為我們都只針對棧頂元素進行操作,...