棧和佇列互相實現,一文弄懂它們的關係

2021-10-21 06:51:14 字數 1762 閱讀 7255

棧和佇列是比較基礎的資料結構。無論在工作中,還是在面試中,棧和佇列都用的比較多。在計算機的世界,你會看到佇列和棧,無處不在。

棧:乙個先進後出的資料結構

佇列:乙個先進先出的資料結構

棧和佇列這兩種資料結構,同時也存在某種聯絡。用棧可以實現佇列,用佇列也可以實現棧。

海邊風景不錯,欣賞一下風景,下面開始步入正題。學完這篇,咱們再接著看風景。

思路:讓資料入stack1,然後棧stack1中的資料出棧併入到棧stack2,然後出stack2。

**如下:

type cqueue struct 

//建構函式    

func constructor() cqueue 

}    

//尾部插入

this.stack1.pushback(value)

}//頭部刪除,back函式返回其list最尾部的值

func (this *cqueue) deletehead() int 

}if this.stack2.len() != 0 

return -1

}

思路:兩個佇列實現乙個棧,使用了佇列交換的思想。

**如下:

type mystack struct 

//建構函式

func constructor() (s mystack) 

func (s *mystack) push(x int) 

s.queue1, s.queue2 = s.queue2, s.queue1

}func (s *mystack) pop() int 

func (s *mystack) top() int 

func (s *mystack) empty() bool 

先將元素入對到 queue2,此時 queue1 為0,交換 queue2 和 queue1。此時 queue2 為0,queue1 中有1個元素。

再執行push操作時,len(queue1) > 0,此時再把 queue1 中的元素插入queue2 的尾部,然後將 queue2 和 queue1 進行交換。

此時相當於,插入 queue2 的兩個元素的位置發生了交換並儲存在 queue1中。最後將 queue1 中的元素出隊,這樣就可以保證後插入的元素先出。

不斷執行 push 操作就行。

思路:使用乙個佇列時,將當前插入元素前面的所有元素,先出隊再入隊即可。

**如下:

type mystack struct 

func constructor() (s mystack) 

func (s *mystack) push(x int) 

}func (s *mystack) pop() int 

func (s *mystack) top() int 

func (s *mystack) empty() bool 

每次執行 push 操作,如果queue存在元素,則將新插入元素前的所有元素出隊,然後依次進隊。這樣新插入的元素就在隊首了。

棧和佇列作為基礎的資料,大家務必掌握其性質和功能,知道它們之間的某種依存關係,才能靈活運用。

上面的演算法雖然很簡單,但是思路很巧妙,還有其他解法,大家也可仔細研究,必有收穫。有本資料結構的書《大話資料結構》推薦給大家。

一文弄懂Nginx最核心的配置

在日常的工作中,跟nginx打交道的時候挺多的。之前對location的匹配規則是一知半解的,為了搞明白location是如何匹配的,查了些資料總結此文。希望能給大家帶來幫助。location uri location name語法規則很簡單,乙個location關鍵字,後面跟著可選的修飾符,後面是...

一文弄懂搜尋演算法中的DFS和BFS

有一位小夥伴問我,迷宮問題怎麼解決,我說dfs或者bfs,然後,ta說,哦哦,這我知道,就是圖裡面的演算法嘛,但,這是個迷宮,難道我要把這個二維矩陣變成圖嘛?我 當場去世。於是我開啟了我的長篇大論。希望大家有所收穫。首先,回答一下那位小夥伴的問題,這個演算法確實屬於圖裡面的演算法,但並不是說是專門針...

棧和佇列的互相實現 以及帶有GetMin的棧

兩個棧實現乙個佇列 基本思路 1.建立兩個棧a,b,a棧用來入棧,b棧用來出棧 2.入佇列操作 a a棧未滿,直接入棧 b a棧已滿,b棧為空,將a棧中的元素全部出棧併入到b棧 c a棧已滿,b棧不為空,a棧擴容。3.出佇列操作 a b棧為空,a棧也為空,丟擲異常 隊列為空 b b棧為空,a棧不為空...