棧的原則是先進的後出,而佇列是先進先出,那麼如何利用兩個棧來實現乙個佇列呢?
我們的思路是利用兩個棧,乙個棧作為橋梁,而另外乙個作為我們的「佇列」。實際上,我們首先對橋梁棧進行入棧,入棧完畢後,再依次去橋梁棧內元素,入棧到我們的「佇列」當中去,此時我們的橋梁棧的棧頂就變成了我們「佇列」裡的隊尾,而橋梁棧的棧底,則變成了「佇列」裡的隊首。
//實現
#include
#include
"seqstack.h"
typedef struct queue_by2stackinit queue_by2stack;
void queue_by2stackinit(queue_by2stack* q)//初始化新的佇列
seqstackinit(&q->input);
seqstackinit(&q->output);
return;
}void queue_by2stackpush(queue_by2stack* q, seqstacktype value)//入隊
seqstacktype top;
int ret;
while(1)
seqstackpush(&q->input, top);
seqstackpop(&q->output);
} seqstackpush(&q->input, value);
while(1)
seqstackpush(&q->output, top);
seqstackpop(&q->input);
} return;
}void queue_by2stackpop(queue_by2stack* q)//出隊
seqstackpop(&q->output);
return;
}int queue_by2stacktop(queue_by2stack* q, seqstacktype* value)//取隊首元素
if(q->output.size ==
0) seqstackgetfront(&q->output, value);
return1;}
void queue_by2stackprint(queue_by2stack* q)
size_t i =
0; for(; i < q->output.size; ++i)
printf("\n");
}
同樣這裡,也用到了我們的順序棧的基本操作函式來幫助我們實現這個隊裡。
//測試**
int main()
資料結構之棧與佇列的面試題 用兩個佇列實現乙個棧
首先要用佇列實現棧,我們主要的問題是,應該讓先入佇列的元素後出去,這樣就是棧的操作了,那該如何操作呢?我們這裡的思路是,首先兩個佇列,起初在入棧的時候插入到任意乙個空佇列當中即可,接下來,如果入棧應該插入到乙個有元素的佇列當中去。在出棧的時候,應該把有元素的佇列內的前n 1個元素全部入到另乙個空佇列...
資料結構之棧和佇列的經典面試題
在這個題目中要求要返回乙個棧裡面的最小值。有兩種方法 1 用兩個棧,乙個棧存入棧的資料,另乙個棧存對應的最小值,如果入棧的順序為5,8,1,3,4,則存最小值的那個棧存入的資料應該為5,5,1,1,1。2 與上邊一樣,用兩個棧,乙個放資料,另乙個放最小值,最小值由結構體組成有兩部分乙個是資料元素da...
資料結構 棧和佇列及其面試題
1.利用順序表實現棧 函式介面 typedef int sdatatype typedef struct stack stack 初始化 void stackinit stack pstack 壓棧 void stackpush stack pstack,sdatatype data 出棧 void...