在咱們的數據結構的學習中,棧是一種數據結構,它按照後進先出的原則存儲數據,先進入的數據被壓入棧底,最後的數據在棧頂,須要讀數據的時候從棧頂開始彈出數據。棧是隻能在某一端插入和刪除的特殊線性表,插入通常稱爲進棧,刪除則稱爲退棧。java
咱們看看java.util.Stack的設計吧。數據結構
咱們來解讀一下官方文檔給的說明吧,Stack類表示對象的後進先出(LIFO)堆棧。它使用五個操做擴展了Vector類,這些操做容許將向量視爲堆棧。提供了常見的推送和彈出操做,以及查看堆棧頂部項目的方法,測試堆棧是否爲空的方法,以及搜索堆棧中的值並發現其從頂部的距離。併發
建立堆棧時,它不包含任何值。函數
Deque接口及其實現提供了更完整和一致的LIFO堆棧操做集,應優先使用此類。例如: 學習
Deque<Integer> stack = new ArrayDeque<Integer>();測試
能夠看到Stack的構造方法就一個,裏面什麼也沒有,就是super()先會調用Vector的默認構造方法。設計
Stack有如下的幾個方法3d
empty()方法就是返回stack是否爲空,判斷的是size()==0對象
peek()方法獲取此堆棧頂部的對象,而不將其從堆棧中刪除。blog
pop()方法移除此堆棧頂部的對象,並將該對象做爲此函數的值返回。其中removeelementAt是繼承的Vector的方法,是加了synchronized
push(E item)將項目推到此堆棧的頂部。其實就是Vector的addElement方法
search(Object o)返回對象在此堆棧上的從1開始的位置
而後咱們看看用stack來解決漢諾塔問題娛樂如下吧!
相傳在古印度聖廟中,有一種被稱爲漢諾塔(Hanoi)的遊戲。該遊戲是在一塊銅板裝置上,有三根杆(編號A、B、C),在A杆自下而上、由大到小按順序放置64個金盤(以下圖)。遊戲的目標:把A杆上的金盤所有移到C杆上,並仍保持原有順序疊好。操做規則:每次只能移動一個盤子,而且在移動過程當中三根杆上都始終保持大盤在下,小盤在上,操做過程當中盤子能夠置於A、B、C任一杆上。
下面的代碼,是我copy網上大神的,若是你運行了,會發現很慢,奸笑!
有什麼討論的內容,能夠加我公衆號: