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