队列是一种特殊的线性表,队列是一种先进先出(FIFO)队列。仅在线性表的两端进行操作,一头插入数据(队尾),一头去除数据(队头),不允许在中间部位进行插入删除操
作。队列是一种特殊的线性表,可以用线性表的顺序存储和链式存储模拟队列的顺序存储和链式存储。首先,我们先模拟队列的顺序存储。用顺序表(线性表的顺序存储)来模拟
队列的顺序存储,需要限制线性表的操作。入队列相当于从顺序表的尾部插入元素,出队列相当于从顺序表的头部删除数据。
借助于我们之前实现的顺序表,在工程中添加如下文件:
seqqueue.h
#ifndef __MY_SEQQUEUE_H__
#define __MY_SEQQUEUE_H__
typedef void SeqQueue;
SeqQueue* SeqQueue_Create(int capacity);
void SeqQueue_Destroy(SeqQueue*queue);
void SeqQueue_Clear(SeqQueue*queue);
int SeqQueue_Append(SeqQueue*queue,void*item);
void* SeqQueue_Retrieve(SeqQueue*queue);
void* SeqQueue_Header(SeqQueue*queue);
int SeqQueue_Length(SeqQueue*queue);
int SeqQueue_Capacity(SeqQueue*queue);
#endif //__MY_SEQQUEUE_H__
seqqueue.c
#define _CRT_SECURE_NO_WARNINGS
#include <stdlib.h>
#include<stdio.h>
#include <string.h>
#include "seqqueue.h"
#include "seqlist.h"
//创建一个队列相当于创建一个线性表
SeqQueue* SeqQueue_Create(int capacity)
{
return SeqList_Create(capacity);
}
void SeqQueue_Destroy(SeqQueue*queue)
{
SeqList_Destroy(queue);
}
void SeqQueue_Clear(SeqQueue*queue)
{
SeqList_Clear(queue);
}
//向队列添加一个元素 相当于队列插入元素 尾插法
int SeqQueue_Append(SeqQueue*queue,void*item)
{
return SeqList_Insert(queue,item,SeqList_Length(queue));
}
//出队列相当于 从线性表删除0号位置的元素
void* SeqQueue_Retrieve(SeqQueue*queue)
{
return SeqList_Delete(queue,0);
}
void* SeqQueue_Header(SeqQueue*queue)
{
return SeqList_Get(queue,0);
}
int SeqQueue_Length(SeqQueue*queue)
{
return SeqList_Length(queue);
}
int SeqQueue_Capacity(SeqQueue*queue)
{
return SeqList_Capacity(queue);
}
test.c
#define _CRT_SECURE_NO_WARNINGS
#include <stdlib.h>
#include<stdio.h>
#include <string.h>
#include "seqqueue.h"
int main()
{
SeqQueue* queue = NULL;
int i,a[5],ret =0;
queue = SeqQueue_Create(10);
if (queue==NULL)
{
return ;
}
for (i= 0;i<5;i++)
{
a[i] = i+1;
ret = SeqQueue_Append(queue,&a[i]);
}
printf("len:%d\n",SeqQueue_Length(queue));
printf("Header:%d\n",*((int*)SeqQueue_Header(queue)));
printf("Capacity:%d\n",SeqQueue_Capacity(queue));
while (SeqQueue_Length(queue)>0)
{
int *tmp = (int*)SeqQueue_Retrieve(queue);
printf("tmp:%d\n",*tmp);
}
SeqQueue_Destroy(queue);
system("pause");
return 0;
}