2個棧實現1個佇列
阿新 • • 發佈:2019-01-25
這是一道很經典的面試題,也是我們必須要搞清楚的一個問題。
我們很清楚的知道棧和佇列最根本的區別是:棧是先進後出,而佇列是先進先出。
那麼問題就來了,如何用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;
}
效果圖: