我們怎麼用兩個棧來實現乙個佇列呢?
首先我們都知道,棧和佇列的 出棧和出佇列是不一樣的,棧是後入先出,佇列是先入先出。
所以我們的思路是,用兩個棧,乙個input,乙個output,
我們每次想入棧的時候就先將output裡面的元素依次出棧然後往input裡面依次入棧,這個時候,input棧頂元素就是最後入棧的元素,我們可以在他後面進行入棧操作,也相當於入佇列操作。
那麼,我們每次想要出棧的時候,就把我們input棧裡面的元素依次出棧,然後依次入棧到output裡面,這個時候output裡面最上面的元素就是最先入棧的元素,這個時候我們進行出棧操作,就相當於,佇列的出佇列操作
接下來就是具體的**實現
#include
#include
"seqstack.h"
#include
"seqstack.c"
typedef struct queuestackqueuestack;
初始化棧
void queuestack_init(queuestack *s)
seqstack_init(s->input);
seqstack_init(s->output);
}
列印函式
void queuestack_print(queuestack *s)
size_t i = 0;
for(;i < s->input.size;i++)
printf("\n");
}
入佇列函式
void queuestack_push(queuestack *s,seqstacktype value)
if(s->output.size ==
0)
size_t i =
0; for(;i < s->output.size;i++)
seqstack_push(&s->input,value);
}
出棧函式
void queuestack_pop(queuestack *s)
seqstacktype top;
size_t i =
0; for(;i < s->input.size;i++)
seqstack_pop(&s->output);
}
取棧頂元素
int queuestack_gettop(queuestack *s,seqstacktype *value)
seqstacktype top;
size_t i =
0; for(;i < s->input.size;i++)
return seqstack_gettop(&s->output,value);
}
下面是測試函式以及驗證結果
如有錯誤,請指出,謝謝
資料結構之棧和佇列面試題(3)兩個佇列實現乙個棧
我們知道佇列是先進先出,而棧是後進先出的,所以要拿兩個佇列來實現乙個棧,我們思路就應該這樣 每次總保持乙個隊列為空,對另乙個佇列進行操作。入棧操作時,我們在那個有元素的佇列後面直接用入佇列操作,就相當於是棧的入棧操作。在進行出棧操作的時候,我們將有元素的佇列裡面的元素依次出佇列,並且入佇列另乙個佇列...
資料結構 棧面試題 兩個佇列實現乙個棧
上篇文章寫了用兩個棧實現乙個佇列,這篇文章實現用兩個佇列實現乙個棧,其實兩者的思想都是差不多的。下邊繼續畫圖說明 下邊給出實現 includetemplateclass stack else if q1.empty q1不空就push進q1 q1空,q2不空 直接放入q1,這樣pop的話可能更方便一...
資料結構之棧與佇列的面試題 用兩個佇列實現乙個棧
首先要用佇列實現棧,我們主要的問題是,應該讓先入佇列的元素後出去,這樣就是棧的操作了,那該如何操作呢?我們這裡的思路是,首先兩個佇列,起初在入棧的時候插入到任意乙個空佇列當中即可,接下來,如果入棧應該插入到乙個有元素的佇列當中去。在出棧的時候,應該把有元素的佇列內的前n 1個元素全部入到另乙個空佇列...