单纯的用线性表或者单链表实现队列已经不足为奇,现在给大家介绍个有特色的,用两个栈实现队列。
如图
这里介绍队列的常用操作:
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 ", SQueue_Length(queue)); printf("Header: %d ", *(int*)SQueue_Header(queue)); for(i=0; i<5; i++) { printf("Retrieve: %d ", *(int*)SQueue_Retrieve(queue)); } printf("Header: %d ", *(int*)SQueue_Header(queue)); printf("Length: %d ", 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 ", *(int*)SQueue_Retrieve(queue)); } SQueue_Destroy(queue); return 0; }