1. 程式人生 > >2個棧實現1個佇列

2個棧實現1個佇列

這是一道很經典的面試題,也是我們必須要搞清楚的一個問題。

我們很清楚的知道棧和佇列最根本的區別是:棧是先進後出,而佇列是先進先出

那麼問題就來了,如何用2個棧實現一個佇列呢?
比方說現在要入佇列4個元素:a b c d,那麼我很明顯出佇列時必須是按照a b c d的順序來出佇列的。
分析如圖:
這裡寫圖片描述

通過上面的圖,我們清晰了該如何實現一個佇列的具體思路:
程式碼如下:
stack.c:

//引用以前的棧函式
#include "seqstack.h"

//建立一個包含倆個棧的結構體
typedef struct my_queue{
    seqstack input;//入佇列的棧
    seqstack output;//出佇列的棧
}my_queue; //初始化 void queueInit(my_queue* root) { if(root == NULL) { return; } seqstackInit(&root->input); seqstackInit(&root->output); } //入佇列 void queuePush(my_queue* root,DataType value) { if(root == NULL) { return; } //先檢查出佇列的棧中有沒有元素,有的話記得要將出佇列的元素全部移過來,才能入佇列
while(root->output.size != 0)//其中“.”與“->”的用法切記不要用錯,開頭有我的連結 { DataType top = seqstackGetTop(&root->output); seqstackPush(&root->input,top); seqstackPop(&root->output); } seqstackPush(&root->input,value); } //出佇列 void queuePop(my_queue* root) { if
(root == NULL) { return; } //和入佇列一樣,都得判斷一下彼此的棧中是否有元素 while(root->input.size != 0) { DataType top = seqstackGetTop(&root->input); seqstackPush(&root->output,top); seqstackPop(&root->input); } seqstackPop(&root->output); } //------------------------------------------------------------- //--------測試程式碼 //------------------------------------------------------------- //列印函式 void queueprint(my_queue* root) { if(root == NULL) { return; } int i = root->input.size-1; printf(" 入佇列的棧:["); for(; i >= 0; i--) { printf("%c ",root->input.arr[i]); } printf(" ]\n"); printf(" 出佇列的棧:["); for(i = root->output.size-1;i >= 0;i--) { printf("%c ",root->output.arr[i]); } printf(" ]\n"); } void testqueue() { LINE; my_queue root; queueInit(&root); printf("入佇列4個元素:\n"); queuePush(&root,'a'); queueprint(&root); queuePush(&root,'b'); queueprint(&root); queuePush(&root,'c'); queueprint(&root); queuePush(&root,'d'); queueprint(&root); printf("\n"); printf("出對列4個元素:\n"); queuePop(&root); queueprint(&root); queuePop(&root); queueprint(&root); queuePop(&root); queueprint(&root); queuePop(&root); queueprint(&root); } int main() { testqueue(); return 0; }

效果圖:
這裡寫圖片描述