棧和佇列是比較基礎的資料結構。無論在工作中,還是在面試中,棧和佇列都用的比較多。在計算機的世界,你會看到佇列和棧,無處不在。
棧:乙個先進後出的資料結構
佇列:乙個先進先出的資料結構
棧和佇列這兩種資料結構,同時也存在某種聯絡。用棧可以實現佇列,用佇列也可以實現棧。
海邊風景不錯,欣賞一下風景,下面開始步入正題。學完這篇,咱們再接著看風景。
思路:讓資料入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棧不為空...