1、隊(duì)列實(shí)現(xiàn)棧原理簡述
棧是一種后進(jìn)先出的數(shù)據(jù)結(jié)構(gòu),而隊(duì)列是一種先進(jìn)先出的數(shù)據(jù)結(jié)構(gòu),兩者原理不難理解,使用也簡單。但是我們不僅僅要掌握數(shù)據(jù)結(jié)構(gòu)的基本原理,還要學(xué)會靈活運(yùn)用,能否靈活運(yùn)用是考察一個(gè)人對數(shù)據(jù)結(jié)構(gòu)的理解程度,也是在面試的時(shí)候經(jīng)常會考到的知識點(diǎn)?,F(xiàn)在假設(shè)面試官要求你用隊(duì)列實(shí)現(xiàn)棧,你的解決方案是什么?通過棧的基本原理我們知道,只要每次進(jìn)行stack_pop操作時(shí)將隊(duì)列里最后一個(gè)元素輸出就能模擬棧的輸出操作。
2、隊(duì)列實(shí)現(xiàn)棧方案和實(shí)現(xiàn)
方案1:
我們很容易想到一種解決方案,隊(duì)列queue1保存原始輸入數(shù)據(jù),隊(duì)列queue2作為臨時(shí)隊(duì)列緩存數(shù)據(jù),只要進(jìn)行stack_pop操作時(shí),先將queue1里除最后一個(gè)元素外全部出隊(duì),且出隊(duì)的數(shù)據(jù)保存在一個(gè)臨時(shí)隊(duì)列queue2里,保存queue1最后的元素,最后再將queue2里的全部元素出隊(duì),且出隊(duì)的元素重新放進(jìn)queue1里,返回保存的queue1最后的元素。
我們作了下圖便于理解2個(gè)隊(duì)列模擬棧的過程。
一個(gè)棧輸出元素順序
兩個(gè)隊(duì)列queue1和queue2模擬棧
在數(shù)據(jù)結(jié)構(gòu)與算法篇-隊(duì)列和數(shù)據(jù)結(jié)構(gòu)與算法篇-棧文章里我們詳細(xì)介紹了隊(duì)列和棧的原理,并都用C實(shí)現(xiàn)了隊(duì)列和?!,F(xiàn)在我們復(fù)用這兩篇文章里隊(duì)列的實(shí)現(xiàn)代碼,用于實(shí)現(xiàn)棧。定義棧相關(guān)數(shù)據(jù)結(jié)構(gòu)和操作函數(shù)代碼如下:
棧初始化函數(shù)實(shí)現(xiàn):
棧銷毀函數(shù)實(shí)現(xiàn):
入棧函數(shù)實(shí)現(xiàn):
出棧函數(shù)實(shí)現(xiàn):
判斷棧是否空和是否滿函數(shù)實(shí)現(xiàn):
從方案1我們知道每次出隊(duì)都需要將隊(duì)列里除最后一個(gè)元素外的元素保存在另外一個(gè)臨時(shí)隊(duì)列里,增加了空間復(fù)雜度。那么能否只用一個(gè)隊(duì)列能否模擬棧呢?通過仔細(xì)觀察方案1發(fā)現(xiàn)queue1出對的數(shù)據(jù)是可以重新再入隊(duì)的,只要讓隊(duì)列里最后一個(gè)元素在隊(duì)列頭即可,那么我們很容易想到方案2。 方案2: 將隊(duì)列queue1里的數(shù)據(jù)依次出隊(duì),且出隊(duì)的數(shù)據(jù)重新放在queue1的隊(duì)尾,直到最后一個(gè)元素在隊(duì)列頭,最后輸出隊(duì)列頭的元素即可。整個(gè)過程我們可以用下圖表示。單個(gè)隊(duì)列模擬棧
單個(gè)隊(duì)列模擬出棧函數(shù)實(shí)現(xiàn)如下:
棧實(shí)現(xiàn)驗(yàn)證
下面我們寫一個(gè)小程序驗(yàn)棧實(shí)現(xiàn)的正確性。
編譯運(yùn)行輸出如下:
隊(duì)列模擬棧完全正確。
責(zé)任編輯:lq6
-
算法
+關(guān)注
關(guān)注
23文章
4682瀏覽量
94346 -
數(shù)據(jù)結(jié)構(gòu)
+關(guān)注
關(guān)注
3文章
573瀏覽量
40525 -
元素
+關(guān)注
關(guān)注
0文章
47瀏覽量
8561
原文標(biāo)題:數(shù)據(jù)結(jié)構(gòu)與算法篇-隊(duì)列實(shí)現(xiàn)棧
文章出處:【微信號:AndroidPush,微信公眾號:Android編程精選】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
深入淺出解析低功耗藍(lán)牙協(xié)議棧

三種藍(lán)牙架構(gòu)實(shí)現(xiàn)方案(藍(lán)牙協(xié)議棧方案)

分布式存儲有哪幾種類型?
常見的有源變壓器有哪幾種?
JavaWeb消息隊(duì)列使用指南
Linux網(wǎng)絡(luò)協(xié)議棧的實(shí)現(xiàn)

嵌入式環(huán)形隊(duì)列與消息隊(duì)列的實(shí)現(xiàn)原理
LED驅(qū)動(dòng)芯片的引腳功能主要包括哪幾種?
玩轉(zhuǎn)RT-Thread之消息隊(duì)列的應(yīng)用

TCP/IP協(xié)議棧的設(shè)計(jì)與實(shí)現(xiàn)_中文
LwIP協(xié)議棧源碼詳解—TCP/IP協(xié)議的實(shí)現(xiàn)
電磁式繼電器有哪幾種型號
斷路器有哪幾種
STM32單片機(jī)有哪幾種常見的開發(fā)環(huán)境?

評論