如何用兩個棧實現佇列的先進先出?

2021-10-25 13:20:19 字數 1930 閱讀 2195

一、分析問題

我們學完了棧和佇列,也對這兩個線性結構有了一定的了解,那麼我們今天來看一看如何用棧實現佇列的特性,先進先出呢?顯然乙個棧是完成不了的。

首先我們需要兩個空棧,我們指定乙個棧stack1當資料來的時候先入stack1,然後將棧stack1的元素依次彈出,彈出元素依次入棧stack2,然後在依次彈出stack2的元素就好了,但是細心的朋友有沒有發現乙個問題,如果我們彈出1、2,在3、4,沒有彈出以前stack1又來了5、6,那怎麼辦?

所以我們要保證的是在有元素入棧stack1以前棧stack2是空的,也就是如果此時有元素要入棧stack1且棧stack2內有元素,要先將棧stack2內的元素全部壓回棧stack1,stack2為空棧,再進行新元素入棧stack1的操作,同樣道理在接下來對stack2進行pop時也要保證stack1中的元素已經全部彈出壓入stack2,也就是stack1是空棧。

二、**實現分析

既然是用棧實現佇列,那麼就一定會用到我們之前學到的,對棧的一系列的操作**。當然沒用到那麼多,那讓我們看看需要我們新實現的部分,我們需要兩個棧去充當乙個佇列,那麼還需要乙個佇列計數器變數來實現監控佇列裡的元素個數,可以把這三個變數封裝在乙個結構體裡面,還需要對我們的這個結構體進行初始化,說白了就是呼叫棧的初始化來對這個結構體裡面的兩個棧進行初始化,然後對佇列的push和pop也要通過棧的push和pop重新完成。

三、**實現

#include

#include

typedef

struct data

mystack;

typedef

struct stack

stack;

void

s_init

(stack *

*pstack)

void

s_push

(stack *pstack,

int nnum)

mystack *ptemp =

null

; ptemp =

(mystack*

)malloc

(sizeof

(mystack));

ptemp->nvalue = nnum;

ptemp->pnext = pstack->ptop;

pstack->ptop = ptemp;

pstack->ncount ++;}

ints_pop

(stack *pstack)

ints_isempty

(stack *psatck)

//以下是新**

用memcache實現簡單的先進先出佇列

本 根據前輩的 簡化修改而成 class memcachequeue private function initsetheadntail 當新增元素時,改變佇列尾的數值 param int step 步長值 param bool reverse 是否反向 return null private fu...

c語言實現佇列的先進先出操作

佇列的特點是先進先出,有乙個佇列頭和乙個佇列尾。如下圖示 整個佇列含有乙個佇列頭指標front和乙個佇列尾指標rear,並且佇列中每個節點中包含乙個資料域和乙個指向下乙個節點的指標域。定義乙個節點 typedef struct nodenode 定義佇列結構體 typedef struct queu...

如何用兩個棧實現乙個佇列

問題 如何用兩個棧實現乙個對列的功能?思路 從棧a入佇列,從棧b出佇列。佇列的2個最重要的操作,入佇列,出佇列。入佇列 從棧a入佇列。出佇列 分兩種情況 如果棧b不為空,直接彈出。如果棧b為空,將棧a中的資料全部彈入棧b中,再從棧b彈出資料 實現如下 queuebystack.cpp 定義控制台應用...