数据结构(队列--两个栈实现)
2017-05-30 14:50
501 查看
单纯的用线性表或者单链表实现队列已经不足为奇,现在给大家介绍个有特色的,用两个栈实现队列。
如图
这里介绍队列的常用操作:
l 创建队列
l 销毁队列
l 清空队列
l 入队
l 出队
l 返回队首元素
l 返回队的大小
代码总分为三个文件:
SQueue.h : 放置功能函数的声明,以及表的声明
SQueue.c : 放置功能函数的定义,以及表的定义
Main.c : 主函数,使用功能函数完成各种需求,一般用作测试
整体结构图为:
这里详细说下入队操作,出队操作和返回队首元素操作:
入队操作:
如图:
出队操作:
如图:
返回队首元素:
如图:
OK! 上代码:
SQueue.h :
[cpp] view
plain copy
#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 :
[cpp] view
plain copy
#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 :
[cpp] view
plain copy
#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;
}
相关文章推荐
- C++ 数据结构实现两个栈实现一个队列
- 数据结构与算法_两个栈实现一个队列的功能
- 数据结构(队列--两个栈实现)
- 【数据结构】(面试题)使用两个栈实现一个队列(详细介绍)
- 【数据结构】(面试题)使用两个栈实现一个队列(详细介绍)
- 数据结构(24)队列--两个栈实现
- 程序员面试宝典之数据结构基础----C++两个栈实现一个队列功能
- 【数据结构】(面试题)使用两个栈实现一个队列(详细介绍)
- 五、数据结构基础之循环队列C语言实现
- 数据结构(五)——双链表、链式栈、链式队列 及实现
- 数据结构之数组实现基础队列结构
- (8)数据结构——队列(链表)实现
- 用C语言模块实现队列数据结构
- PHP实现队列(Queue)数据结构
- 【数据结构与算法基础】以数组实现的循环队列 / Circular Queue implemented by array
- 数据结构之 队列的操作与实现
- PHP实现队列(Queue)数据结构
- 数据结构:队列的实现
- 数据结构实验之实现两个复数的四则运算
- 数据结构(Data structure):使用双向链表实现队列(C语言)