用棧實現佇列,用佇列實現棧。好玩!!!

2021-10-07 08:08:42 字數 2731 閱讀 2037

因為在資料結構中,棧和佇列長得實在是太像了,將他們拿來比較是不可避免的,棧—後進先出,而佇列—先進先出。同樣是只能在一端進行操作,那麼問題來了,能相互實現??

能不能得好好分析一下嘛,如果是用兩個棧來實現佇列,好像這操作可以哦。**一下,你就明白!

顯然用兩個棧可以實現佇列的功能,就是借助另乙個棧來中轉一下,這樣的操作在圖論演算法中的dijkstra求最短路徑中也會用到。把後進先出轉換成先進先出。那麼怎麼用**來實現呢?既然需要兩個棧,那就定義兩個棧唄,乙個用於進佇列操作,另乙個棧就用於出佇列操作,完美解決!具體所用的棧和佇列在之前的文章已經實現,拿來用就是了。當然用鏈式的棧和佇列是最好的。

實現的時候注意一下細節哦。話不多說,上**:

#include

"linkstack.h"

template

<

typename t>

class

stacktoqueue

void

dequeue()

// 出隊需要注意細節的問題

out_stack.

pop();

// 真正的出佇列操作

}else

} t front()

const

// 獲取隊頭元素的操作與出隊操作基本一致

ret = out_stack.

top();

// 棧頂元素就是隊頭元素

}else

// 這是出佇列的棧不為空的情形

return ret;

}int

length()

const

// 直接將兩個棧的大小相加再返回

void

clear()

// 將兩個棧清空

~stacktoqueue()

};

來,測試一下是否實現了佇列的先進先出,把上面實現的**全部拷貝下面 這個測試程式,我就省略這一步了哈:

好了,棧實現了佇列。那佇列怎麼實現棧呢,還是看圖吧!

具體用栗子來說明哈。比如上圖,乙個佇列有四個元素,另乙個佇列則為空,入棧就直接將資料放到用作入棧的佇列。

那齣棧怎麼操作呢,再來看一張圖:

把第乙個佇列的n-1個元素轉移到另乙個佇列,然後是不是發現第乙個佇列只剩下乙個元素了!是的呢,那麼這個元素的位置就相當於棧頂,出棧就很容易了嘛,對第乙個佇列進行出佇列操作就完成啦。獲取棧頂元素也一樣,不過是出佇列的操作換成了獲取隊頭元素,然後將其返回。但是出棧操作之後一定要將入棧的佇列和出棧的佇列交換,這是用佇列實現棧的關鍵點。

好了,該上**了:

#include

"linkqueue.h"

template

<

typename t>

class

queuetostack

void

push

(const t& obj)

// 入棧操作

void

pop(

)// 出棧操作,需要注意

p_in-

>

dequeue()

;// 轉移完後對入佇列進行出隊操作,相當於出棧

linkqueue

* tem = p_in;

// 出棧後就馬上交換兩個指標的指向

p_in = p_out;

p_out = tem;

}else}

t top()

const

// 獲取棧頂元素

ret = p_in-

>

front()

;}else

return ret;

}int

size()

const

void

clear()

~queuetostack()

};

測試一下,是否滿足棧的後進先出!

#include

using

namespace std;

intmain

(int argc,

const

char

* ar**)

for(

int i =

0; i <10;

++ i)

return0;

}

看看輸出結果,滿足了!

用棧實現佇列 用佇列實現棧

棧的特點 filo firstinlastout 僅能從棧頂插入,刪除元素。最基本的介面包括push 從棧頂壓入元素 pop 從棧頂彈出元素 佇列的特點 fifo firstinfirstout 僅能從隊頭刪除元素,從隊尾插入元素。最基本的介面包括enque 從隊尾插入元素 deque 從隊頭刪除元...

232 用棧實現佇列 225 用佇列實現棧

用棧實現佇列 佇列是先進先出,實現佇列的最直觀的方法是用鍊錶。但本題是要求使用棧。本題兩個stack相互倒,負負得正 class myqueue def init self self.instack self.outstack defpush self,x def pop self if len s...

用棧實現佇列

正如標題所述,你需要使用兩個棧來實現佇列的一些操作。佇列應支援push element pop 和 top 其中pop是彈出佇列中的第乙個 最前面的 元素。pop和top方法都應該返回第乙個元素的值。public class solution public void push int element...