利用栈实现队列(C语言实现)
来源:互联网 发布:在线office办公软件 编辑:程序博客网 时间:2024/05/22 17:57
在上一篇优化后队列的实现(C语言实现) 中,虽然我们对队列的时间复杂度进行了优化,但是却让代码的可读性变差了,代码显得略微臃肿(当然,这些话你看看就好,主要是为了奉承这篇博文的)。
这里主要实现的是:利用栈来实现队列
基本思路:
1,创建两个栈
2,两个栈合并起来组装成一个队列,分别取名为instack,outstack,用于进队列,出队列
3,比如有1,2,3,4,5 需要进入队列,先将这一串数压入instack栈中,假设压入顺序为1,2,3,4,5(1为栈底),再将instack中的数据移入outstack中,出栈顺序为:5,4,3,2,1. 那么入outsatck的时候,进栈的顺序同样为 : 5,4,3,2,1(5为栈底),那么出outstack的时候,顺序即为:1,2,3,4,5 这样就做到了入是1,2,3,4,5 出也是1,2,3,4,5 这样就跟队列是一样一样的了。
代码实现思路:
实现思路
准备两个栈用于实现队列:inStack和outStack
当有新元素入队时: :将其压入 将其压入inStack中
当需要出队时:
当outStack为空时:
1. 将inStack中的元素逐一弹出并压入outStack中
2. 将outStack的栈顶元素弹出
当outStack不为空时:
– 直接将outStack的栈顶元素弹出
源代码入下:
这里用到了栈的代码,具体可以参阅:栈的实现与操作(C语言实现)
头文件:
#ifndef _SPQueue_H_#define _SPQueue_H_typedef void SPQueue;SPQueue* SPQueue_Create();void SPQueue_Destroy(SPQueue* queue);void SPQueue_Clear(SPQueue* queue);int SPQueue_Append(SPQueue* queue, void* item);void* SPQueue_Retrieve(SPQueue* queue);void* SPQueue_Header(SPQueue* queue);int SPQueue_Length(SPQueue* queue);#endif
源文件:
// 栈实现队列.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include "SPQueue.h"#include "LinkStack.h"#include <malloc.h>#include <stdlib.h>typedef struct {LinkStack * instack;LinkStack * outstack;} TSPQueue;int _tmain(int argc, _TCHAR* argv[]){ SPQueue* queue = SPQueue_Create(); int a[10] = {0}; int i = 0; for(i=0; i<10; i++) { a[i] = i + 1; SPQueue_Append(queue, a + i); } printf("第一次进队列:"); printf("Header: %d\n", *(int*)SPQueue_Header(queue)); printf("Length: %d\n", SPQueue_Length(queue)); for(i=0; i<5; i++) { printf("%d\t出队列了\n", *(int*)SPQueue_Retrieve(queue)); } printf("\n第二次进队列:\n"); printf("Header: %d\n", *(int*)SPQueue_Header(queue)); printf("Length: %d\n", SPQueue_Length(queue)); for(i=0; i<10; i++) //继续尾加10个节点 { a[i] = i + 1; SPQueue_Append(queue, a + i); } while( SPQueue_Length(queue) > 0 ) { printf("%d\t出队列了\n", *(int*)SPQueue_Retrieve(queue)); } SPQueue_Destroy(queue); system("pause");return 0;}//创建SPQueue* SPQueue_Create(){TSPQueue* ret = (TSPQueue*)malloc(sizeof(TSPQueue));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 SPQueue_Destroy(SPQueue* queue){SPQueue_Clear(queue);free(queue);}//清空void SPQueue_Clear(SPQueue* queue){TSPQueue* SPQueue = (TSPQueue*)queue;if (NULL != SPQueue){LinkStack_Clear(SPQueue->instack);LinkStack_Clear(SPQueue->outstack);}}//尾加int SPQueue_Append(SPQueue* queue, void* item){TSPQueue* SPQueue = (TSPQueue*)queue;int ret = 0;if (NULL != SPQueue){ret = LinkStack_Push(SPQueue->instack,item);}return ret;}//删除头部void* SPQueue_Retrieve(SPQueue* queue){TSPQueue* SPQueue = (TSPQueue*)queue;void * ret = NULL;if (NULL != SPQueue){//当outstack长度为0时,把instack中的数据移入outstackif (LinkStack_Size(SPQueue->outstack) == 0){while (LinkStack_Size(SPQueue->instack) > 0){LinkStack_Push(SPQueue->outstack,LinkStack_Pop(SPQueue->instack));}}//取出outstack的栈顶ret = LinkStack_Pop(SPQueue->outstack);}return ret ;}//获得头部void* SPQueue_Header(SPQueue* queue){TSPQueue* SPQueue = (TSPQueue*)queue;void * ret = NULL;if (NULL != SPQueue){if (LinkStack_Size(SPQueue->outstack) == 0){while (LinkStack_Size(SPQueue->instack) > 0){LinkStack_Push(SPQueue->outstack,LinkStack_Pop(SPQueue->instack));}}ret = LinkStack_Top(SPQueue->outstack);}return ret ;}//长度int SPQueue_Length(SPQueue* queue){TSPQueue* SPQueue = (TSPQueue*)queue;int ret = 0;if (NULL != SPQueue){ret = LinkStack_Size(SPQueue->instack) + LinkStack_Size(SPQueue->outstack);}return ret;}
运行结果:
第一次进队列:Header: 1Length: 101 出队列了2 出队列了3 出队列了4 出队列了5 出队列了第二次进队列:Header: 6Length: 56 出队列了7 出队列了8 出队列了9 出队列了10 出队列了1 出队列了2 出队列了3 出队列了4 出队列了5 出队列了6 出队列了7 出队列了8 出队列了9 出队列了10 出队列了请按任意键继续. . .
如有错误,望不吝指出。
1 0
- 利用栈实现队列(C语言实现)
- 队列 C语言实现
- 队列C语言实现
- C语言实现队列
- 队列 c语言实现
- C语言实现队列
- C语言实现队列
- C 语言实现队列
- c语言实现队列
- C语言实现队列
- C语言队列实现
- C语言实现队列
- C++:利用两个栈实现队列操作
- 栈和队列 C语言实现
- 链表、栈、队列的C语言实现
- 队列的C语言实现
- 队列实现文件C语言
- C语言实现链队列
- android图片处理方法
- epoll的事件解释
- stc90c52rc的eeprom读写
- 讽德诵功电饭锅 好
- 如何生成SSL证书
- 利用栈实现队列(C语言实现)
- 局域网之间文件共享工具HFS(Http File Server)
- CView类详解
- 万能框架spring(三)之SSH
- C语言 文件的读写
- 整理log4j配置详解
- tomcat下catalina.out日志文件分割
- perl函数说明(connect)
- mockito