“ 队列是一种特殊的线性表。
队列仅在线性表的头部和尾部进行操作
队头(Front):取出元素的一端
队尾(Rear):插入元素的一端
队列通常有两种实现方式
顺序结构实现
链式结构实现。
队列应用
打印机队列
广度优先搜索”
队列的基本定义及实现
队列是一种特殊的线性表。
队列仅在线性表的两端并进行操作
队头(Front):取出元素的一端
队尾(Rear):插入元素的一端
队列不允许在中间部位操作
#include <iostream> using namespace std; const int maxn = 5; int q[maxn],tail= 0,,head= 0;// 指针赋值为0,队列初始化 void push (int x)// x进队尾部进行操作 { q[tail]= x; tail=(tail+1)%maxn;// 解决队列假满问题 } int pop() { int x = q[head];// 先取队首删除元素 head=(head+1)%maxn; } bool isEmpty()// 判空 {return head == tail;} bool isPull()// 判空 {return tail+1 == head;}// 判满 int main() { //1 2 3 push(1); push(2); cout<< pop(); return 0; }队列的顺序存储实现
SeqQueue.h
#ifndef _SEQQUEUE_H_ #define _SEQQUEUE_H_ typedef void SeqQueue;// 数据封装 SeqQueue* SeqQueue_Create(int capacity); void SeqQueue_Destory(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); #endifSeqQueue.c
#include "SeqList.h" #include "SeqQueue.h" SeqQueue* SeqQueue_Create(int capacity) {return SeqList_Create(capacity);} void SeqQueue_Destory(SeqQueue* queue) {SeqList_Destory(queue);} void SeqQueue_Clear(SeqQueue* queue) {SeqList__Clear(queue);} int SeqQueue_Append(SeqQueue* queue,void* item)// 在尾部插入 {return SeqList_Insert(queue,item,SeqList_Length(queue));} void SeqQueue_Retrieve(SeqQueue* queue)// 在队列头部拿走元素o(n) {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);}main.c
#include <stdio.h> #inclkude <stdlib.h> #include "SeqQueue.h" int main(int argc,char *argv[]) { SeqQueue* queue = SeqQueue_Create(20); int a[10] = {0};// 定义数组方便测试 int i= 0 ; for (i=0;i<10;i++)// 数组元素插入队列 { a[i] = i+1; SeqQueue_Append(queue,a + i); } printf("Header: %d\n",*(int*)SeqQueue_Header(queue)); printf("Length: %d\n",*(int*)SeqQueue_Length(queue)); printf("Capacity: %d\n",*(int*)SeqQueue_Capacity(queue)); while(SeqQueue_Length(queue) > 0)// 队列逐个元素取出 { printf("Retrieve: %d\n",*(int*)SeqQueue_Retrieve(queue)); } SeqQueue_Destory(queue); return 0; }队列优化链式储存实现
LinkQueue.h
#ifndef _LINKQUEUE_H_ #define _LINKQUEUE_H_ typedef void LinkQueue; LinkQueue* LinkQueue_Create(); void LinkQueue_Destory(LinkQueue* queue); void LinkQueue_Clear(LinkQueue* queue); int LinkQueue_Append(LinkQueue* queue,void* item);// 插入 void LinkQueue_Retrieve(LinkQueue* queue);// 取回元素 void LinkQueue_Header(LinkQueue* queue); int LinkQueue_Length(LinkQueue* queue); #endifLinkQueue.c.
#include <malloc.h> #include "LinkList.h" #include "LinkQueue.h" typedef struct _tag _LinkQueueNode // 结构体第一个成员是 LinkListNode { LinkListNode header; void* item; }TLinkListNode; LinkQueue* LinkQueue_Create() {return LinkList_Create();} void LinkQueue_Destory(LinkQueue* queue) { LinkQueue_Clear(queue);// 与链式栈实现原理一致,为了释放结构体所占的空间,逐个释放 LinkList_Destory(queue); } void LinkQueue_Clear(LinkQueue* queue)// o(n) {// 队列里每个元素附加的空间释放掉,这样不会产生内存泄漏 while(LinkQueue(queue) > 0) { LinkQueue_Retrieve(queue); } } int LinkQueue_Append(LinkQueue* queue,void* item)// 插入o(n) { TLinkListNode* node = (TLinkQueueNode*malloc(sizeof(TLinkQueueNode)); int ret = (item !=NULL) && (node !=NULL);// 队列不为空且申请队空间不为空 if (ret) { node >item = item; ret = LinkList_Insert(queue,(TLinkQueueNode*)node,LinkList_Length(queue,0); // 插到队列尾部 } if (!ret)// 没插入成功,释放申请的node { free(node); } return ret; } void LinkQueue_Retrieve(LinkQueue* queue)// 取回元素 { TLinkQueueNode* node = (TLinkQueueNode*)LinkList_Delete(queue,0); void* ret = NULL; if (node != NULL) { ret = node->item;// 真正队列元素返回 free(node);// 在append中申请的空间释放掉 } return ret; } void LinkQueue_Header(LinkQueue* queue) { TLinkQueueNode* node = (TLinkQueueNode*)LinkList_Get(queue,0); void* ret = NULL; if (node != NULL) { ret = node->item; } return ret; } int LinkQueue_Length(LinkQueue* queue) {return LinkList_Length(queue);} #endifmain.c
#include <stdio.h> #inclkude <stdlib.h> #include "SeqQueue.h" int main(int argc,char *argv[]) { LinkQueue* queue = LinkQueue_Create(20); int a[10] = {0};// 定义数组方便测试 int i= 0 ; for (i=0;i<10;i++)// 数组元素插入队列 { a[i] = i+1; LinkQueue_Append(queue,a + i); } printf("Header: %d\n",*(int*)LinkQueue_Header(queue)); printf("Length: %d\n",*(int*)LinkQueue_Length(queue)); while(LinkQueue_Length(queue) > 0)// 队列逐个元素取出 { printf("Retrieve: %d\n",*(int*)LinkQueue_Retrieve(queue)); } LinkQueue_Destory(queue); return 0; }