資料結構之棧和佇列面試題(3)兩個佇列實現乙個棧

2021-08-19 18:01:25 字數 1872 閱讀 8763

我們知道佇列是先進先出,而棧是後進先出的,所以要拿兩個佇列來實現乙個棧,我們思路就應該這樣:

每次總保持乙個隊列為空,對另乙個佇列進行操作。

入棧操作時,我們在那個有元素的佇列後面直接用入佇列操作,就相當於是棧的入棧操作。

在進行出棧操作的時候,我們將有元素的佇列裡面的元素依次出佇列,並且入佇列另乙個佇列,當出的還剩乙個元素的時候,這個時候出佇列的元素就是隊尾元素,就相當於棧的出棧。正好就是棧的後入先出。

下面就是具體的**實現

#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個元素全部入到另乙個空佇列...