博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
数据结构-线性表-队列
阅读量:6687 次
发布时间:2019-06-25

本文共 3743 字,大约阅读时间需要 12 分钟。

 

队列的特别实现(两个栈模拟队列)

组合使用两个栈的后进先出可以实现队列的先进先出,简单高效,入队和出队的时间复杂度可以到 O(1)

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 
#include
#include "LinkStack.h"#include "SQueue.h"typedef struct _tag_SQueue{ LinkStack* inStack; LinkStack* outStack;} TSQueue;SQueue* SQueue_Create() // O(1){ TSQueue* ret = (TSQueue*)malloc(sizeof(TSQueue)); if( ret != NULL ) { ret->inStack = LinkStack_Create(); ret->outStack = LinkStack_Create(); if( (ret->inStack == NULL) || (ret->outStack == NULL) ) { LinkStack_Destroy(ret->inStack); LinkStack_Destroy(ret->outStack); free(ret); ret = NULL; } } return ret;}void SQueue_Destroy(SQueue* queue) // O(n){ SQueue_Clear(queue); free(queue);}void SQueue_Clear(SQueue* queue) // O(n){ TSQueue* sQueue = (TSQueue*)queue; if( sQueue != NULL ) { LinkStack_Clear(sQueue->inStack); LinkStack_Clear(sQueue->outStack); }}int SQueue_Append(SQueue* queue, void* item) // O(1){ TSQueue* sQueue = (TSQueue*)queue; if( sQueue != NULL ) { LinkStack_Push(sQueue->inStack, item); }}void* SQueue_Retrieve(SQueue* queue) // O(1){ TSQueue* sQueue = (TSQueue*)queue; void* ret = NULL; if( sQueue != NULL ) { if( LinkStack_Size(sQueue->outStack) == 0 ) { while( LinkStack_Size(sQueue->inStack) > 0 ) { LinkStack_Push(sQueue->outStack, LinkStack_Pop(sQueue->inStack)); } } ret = LinkStack_Pop(sQueue->outStack); } return ret;}void* SQueue_Header(SQueue* queue) // O(1){ TSQueue* sQueue = (TSQueue*)queue; void* ret = NULL; if( sQueue != NULL ) { if( LinkStack_Size(sQueue->outStack) == 0 ) { while( LinkStack_Size(sQueue->inStack) > 0 ) { LinkStack_Push(sQueue->outStack, LinkStack_Pop(sQueue->inStack)); } } ret = LinkStack_Top(sQueue->outStack); } return ret;}int SQueue_Length(SQueue* queue) // O(1){ TSQueue* sQueue = (TSQueue*)queue; int ret = -1; if( sQueue != NULL ) { ret = LinkStack_Size(sQueue->inStack) + LinkStack_Size(sQueue->outStack); } return ret;}

main.c

#include 
#include
#include "SQueue.h"/* run this program using the console pauser or add your own getch, system("pause") or input loop */int main(int argc, char *argv[]) { SQueue* queue = SQueue_Create(); int a[10] = {
0}; int i = 0; for(i=0; i<10; i++) { a[i] = i + 1; SQueue_Append(queue, a + i); } printf("Header: %d\n", *(int*)SQueue_Header(queue)); printf("Length: %d\n", SQueue_Length(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;}

 

假定有这样一个拥有3个操作的队列:

1. EnQueue(v): 将v加入队列中
2. DeQueue(): 使队列中的队首元素删除并返回此元素
3. MaxElement(): 返回队列中的最大值
请设计一种数据结构和算法,让MaxElement()操作的时间复杂度尽可能的低。

 

转载地址:http://fhhao.baihongyu.com/

你可能感兴趣的文章
AD域中客户端时间与服务器时间不同步的解决办法
查看>>
Windows Server 2008 AD R2 AD回收站恢复删除用户两种方法的比较
查看>>
传播正能量-IT的笑傲江湖
查看>>
【图】不做IT果然青春焕发:程序员辞职卖水果
查看>>
【自然框架】开源社区活动,会员注册的第一份代码!
查看>>
最新Android SDK/ADT/NDK的下载位置
查看>>
ORACLE存储之NUMBER类型
查看>>
空间数据库学习笔记(五):可编程性
查看>>
Cookie乱码解决方法
查看>>
解决“System.Diagnostics.Process调用批处理运行powershell.exe”的问题
查看>>
最聪明的人是最笨的!——《潜伏》在办公室(完整版)之十二(陆琪作品)...
查看>>
C# 视频监控系列(14):总结贴——VC++代码转成C#小结
查看>>
转 Android开发环境搭建全程演示(jdk+eclip+android sdk)
查看>>
内存不足引起的SIGKILL:一个缓冲区不断增长问题的定位与解决(解释SIGKILL原因)...
查看>>
T-SQL查询笔记1:当使用联接时on和where子句的区别
查看>>
第4章 Notification与状态栏信息
查看>>
Linq To Object 示例
查看>>
1. asp.net实现单点登陆
查看>>
【英语天天读】优秀的标准
查看>>
童话世界整理------“说说”
查看>>