一步一步学数据结构之1--1(队列--两个栈实现)
来源:互联网 发布:js 观察者模式 实例 编辑:程序博客网 时间:2024/05/21 22:21
单纯的用线性表或者单链表实现队列已经不足为奇,现在给大家介绍个有特色的,用两个栈实现队列。
如图
这里介绍队列的常用操作:
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;}
- 一步一步学数据结构之1--1(队列--两个栈实现)
- 一步一步学数据结构之1--1(栈--两个队列实现)
- 一步一步学数据结构之1--1(栈--单链表实现)
- 一步一步学数据结构之1--1(队列--线性表实现--不存在循环)
- 一步一步学数据结构之1--1(循环队列--线性表实现)
- 一步一步学数据结构之1--1(队列--单链表表实现--不含队头尾指针)
- 一步一步学数据结构之1--1(队列--单链表实现--含队头尾指针)
- 一步一步学数据结构之1--1(栈--线性表实现)
- 小菜一步一步学数据结构之(六)队列
- 一步一步学数据结构之1--n(二叉树遍历--非递归实现)
- 一步一步学数据结构之1--1(线性表)
- 一步一步学数据结构之1--1(单链表)
- 一步一步学数据结构之1--1(静态链表)
- 一步一步学数据结构之1--1(循环链表)
- 一步一步学数据结构之1--1(双向链表)
- 一步一步学数据结构之1--n(通用树)
- 一步一步学数据结构之1--n(二叉树)
- 数据结构之两个栈实现队列
- extjs4学习笔记
- linux驱动入门之LCD驱动
- 卸载VS2010助手
- HDU 1102/POJ 2421 Constructing Roads(MST&Prim优化)
- iOS 滤镜 和 iOS6 中的Core Image技术
- 一步一步学数据结构之1--1(队列--两个栈实现)
- mysql 的启动与关闭
- php header函数的详细解析(转)
- iOS synchronized的作用
- Objective-C 关于空值nil和Nil和NULL和NSNull
- 五大机器视觉测量应用,彰显远心镜头技术优势
- django开发问题杂记
- Result analysis on Loading test use visual studio.
- 从网络得到图片数据保存到手机中,