單純的用線性表或者單鏈表實現隊列已經不足爲奇,現在給大家介紹個有特色的,用兩個棧實現隊列。
如圖
這裏介紹隊列的常用操作:
l 創建隊列
l 銷燬隊列
l 清空隊列
l 入隊
l 出隊
l 返回隊首元素
l 返回隊的大小
代碼總分爲三個文件:
SQueue.h : 放置功能函數的聲明,以及表的聲明
SQueue.c : 放置功能函數的定義,以及表的定義
Main.c : 主函數,使用功能函數完成各種需求,一般用作測試
整體結構圖爲:
這裏詳細說下入隊操作,出隊操作和返回隊首元素操作:
入隊操作:
如圖:
出隊操作:
如圖:
返回隊首元素:
如圖:
OK! 上代碼:
SQueue.h :
- #ifndef _SQUEUE_H_
- #define _SQUEUE_H_
- typedef void SQueue;
- SQueue* SQueue_Create();
- void SQueue_Destroy(SQueue* queue);
- void SQueue_Clear(SQueue* queue);
- int SQueue_Append(SQueue* queue, void* item);
- void* SQueue_Retrieve(SQueue* queue);
- void* SQueue_Header(SQueue* queue);
- int SQueue_Length(SQueue* queue);
- #endif
SQueue.c :
- #include <stdio.h>
- #include <malloc.h>
- #include “LinkStack.h”
- #include “SQueue.h”
- typedef struct _tag_SQueue
- {
- LinkStack* inStack;
- LinkStack* outStack;
- }TSQueue;
- SQueue* SQueue_Create()
- {
- TSQueue* ret = (TSQueue*)malloc(sizeof(TSQueue));
- if(NULL != ret)
- {
- ret->inStack = LinkStack_Create();
- ret->outStack = LinkStack_Create();
- if((NULL == ret->inStack) || (NULL == ret->outStack))
- {
- LinkStack_Destroy(ret->inStack);
- LinkStack_Destroy(ret->outStack);
- free(ret);
- ret = NULL;
- }
- }
- return ret;
- }
- void SQueue_Destroy(SQueue* queue)
- {
- SQueue_Clear(queue);
- free(queue);
- }
- void SQueue_Clear(SQueue* queue)
- {
- TSQueue* sQueue = (TSQueue*)queue;
- if(NULL != sQueue)
- {
- LinkStack_Clear(sQueue->inStack);
- LinkStack_Clear(sQueue->outStack);
- }
- }
- int SQueue_Append(SQueue* queue, void* item)
- {
- TSQueue* sQueue = (TSQueue*)queue;
- int ret = 0;
- if(NULL != sQueue)
- {
- ret = LinkStack_Push(sQueue->inStack, item);
- }
- return ret;
- }
- void* SQueue_Retrieve(SQueue* queue)
- {
- TSQueue* sQueue = (TSQueue*)queue;
- void* ret = NULL;
- if(NULL != sQueue)
- {
- if(0 == LinkStack_Size(sQueue->outStack))
- {
- while(0 < LinkStack_Size(sQueue->inStack))
- {
- LinkStack_Push(sQueue->outStack, LinkStack_Pop(sQueue->inStack));
- }
- }
- ret = LinkStack_Pop(sQueue->outStack);
- }
- return ret;
- }
- void* SQueue_Header(SQueue* queue)
- {
- TSQueue* sQueue = (TSQueue*)queue;
- void* ret = NULL;
- if((NULL != sQueue) && (0 < SQueue_Length(queue)))
- {
- if(0 == LinkStack_Size(sQueue->outStack))
- {
- while(0 < LinkStack_Size(sQueue->inStack))
- {
- LinkStack_Push(sQueue->outStack, LinkStack_Pop(sQueue->inStack));
- }
- }
- ret = LinkStack_Top(sQueue->outStack);
- }
- return ret;
- }
- int SQueue_Length(SQueue* queue)
- {
- TSQueue* sQueue = (TSQueue*)queue;
- int ret = -1;
- if(NULL != sQueue)
- {
- ret = LinkStack_Size(sQueue->inStack) +
- LinkStack_Size(sQueue->outStack);
- }
- return ret;
- }
Main.c :
- #include <stdio.h>
- #include <stdlib.h>
- #include “SQueue.h”
- int main(void)
- {
- SQueue* queue = SQueue_Create();
- int a[10];
- int i = 0;
- for(i=0; i<10; i++)
- {
- a[i] = i+1;
- SQueue_Append(queue, a+i);
- }
- printf(”Length: %d\n”, SQueue_Length(queue));
- printf(”Header: %d\n”, *(int*)SQueue_Header(queue));
- for(i=0; i<5; i++)
- {
- printf(”Retrieve: %d\n”, *(int*)SQueue_Retrieve(queue));
- }
- printf(”Header: %d\n”, *(int*)SQueue_Header(queue));
- printf(”Length: %d\n”, SQueue_Length(queue));
- for(i=0; i<10; i++)
- {
- a[i] = i+1;
- SQueue_Append(queue, a+i);
- }
- while(SQueue_Length(queue) > 0)
- {
- printf(”Retrieve: %d\n”, *(int*)SQueue_Retrieve(queue));
- }
- SQueue_Destroy(queue);
- return 0;
- }