用兩個棧實現乙個佇列功能

2021-06-13 02:09:44 字數 1744 閱讀 5165

1、c++實現

#include#includeusing namespace std;

/*使用兩個堆疊實現佇列

s1:實現入隊,s2:實現出隊

首先,將資料存放在棧s1中,然後將資料push進s2中,再將s2中的資料pop

出佇列:

(1)如果棧b不為空,直接彈出棧b的資料

(2)如果棧b為空,則依次彈出棧a的資料,放入棧b中,再彈出棧b的資料

*/templatestruct queue

t front()

}return s2.top(); }

void pop()

}}};

2、c實現

/*

* 用兩個棧實現佇列

*/#include#includetypedef struct stack

st;/*

* 初始化指定大小的棧

*/st *initstack(int num)

s->loc=0;

s->max=num;

s->a=(int *)malloc(sizeof(int)*num);

if(s->a==null)

return s;}/*

* 判斷棧是否為空(空:返回1 非空:返回0)

*/int isstackempty(st *s)

/** 判斷棧是否為滿(滿:返回1 非滿:返回0)

*/int isstackfull(st *s)

/** 棧中元素個數

*/int getstacknum(st *s)

/** 入棧

*/void pushstack(st *s,int value)

s->a[s->loc]=value;

s->loc++;}/*

* 出棧

*/int popstack(st *s)

int temp=s->a[s->loc-1];

s->loc--;

return temp;}/*

* 檢視棧頂元素

*/int peekstack(st *s)

int temp=s->a[s->loc-1];

return temp;}/*

* 將乙個棧中的元素拷貝到另一棧中

*/void copy(st *src,st *dest)

while(isstackempty(src)!=1) }

/** 列印棧中的各個元素

*/void printstack(st *s)

while(isstackempty(s)!=1) }

/** 入佇列(入佇列的元素儲存在src中)

*/void pushqueue(st *src,st *dest,int value)

src->a[src->loc]=value;

src->loc++;}/*

* 出佇列

* (如果dest不為空,則直接從dest彈出乙個元素)

* (如果dest為空,src不為空,則先將src中的元素拷貝到dest中,在從dest中彈出乙個元素)

*/int popqueue(st *src,st *dest)

if(isstackempty(dest)!=1)

else if(isstackempty(dest)==1&&isstackempty(src)!=1) }

int main()

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

做題之前,我們先來回顧一下 棧和佇列的相同點以及不同點 便於做題時的應用!1.區別與聯絡 相同點 1 棧和佇列都是控制訪問點的線性表 2 棧和佇列都是允許在端點處進行資料的插入和刪除的資料結構 不同點 1 棧遵循 後進先出 lifo 的原則,即只能在該線性表的一頭進行資料的插入和刪除,該位置稱為 棧...

用兩個棧實現乙個佇列,用兩個佇列實現乙個棧

t deletehead 頭部刪除節點 while s1.empty t ret s2.top s2.pop return ret private stacks1 stacks2 問題2 用兩個佇列實現乙個棧 問題分析 用兩個佇列實現乙個棧,刪除時,由於佇列是先進先出的,而棧是後進先出,因此假設現在...

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

思路 棧 先進後出,佇列 先進先出 如果轉化 1.將內容先push進乙個棧instack,2.判斷outstack是否為空,空 將棧instack中的元素pop 刪除並返回陣列的最後乙個元素 並push進outstack,非空 直接出棧 3.出棧時,先push進instack先從outstack出來...