1.队列的概念
队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出 FIFO(First In First Out) 入队列:进行插入操作的一端称为队尾 出队列:进行删除操作的一端称为队头。
2.队列的实现
队列也可以数组和链表的结构实现,使用链表的结构实现更优一些,因为如果使用数组的结构,出队列在数 组头上出数据,效率会比较低。
队列实现代码如下:
#ifndef __QUEUE_H__
#define __QUEUE_H__
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<string.h>
#include<malloc.h>
#include<time.h>
typedef int QUDataType;
typedef struct QueueNode
{
struct QueueNode* _next;
QUDataType _data;
}QueueNode;
typedef struct Queue
{
QueueNode* _head;
QueueNode* _tail;
}Queue;
void QueueInit(Queue* pq);
void QueueDestory(Queue* pq);
QueueNode* BuyQueueNode(QUDataType x);
void QueuePush(Queue* pq, QUDataType x);
void QueuePop(Queue* pq);
QUDataType QueueFront(Queue* pq);
QUDataType QueueBack(Queue* pq);
int QueueEmpty(Queue* pq);
int QueueSize(Queue* pq);
void QueuePrint(Queue* pq);
void TestQueue();
#endif
接口的具体实现:
#include "Queue.h"
//初始化队列
void QueueInit(Queue* pq)
{
assert(pq);
pq->_head = pq->_tail = NULL;
}
//销毁队列
void QueueDestory(Queue* pq)
{
struct QueueNode* cur = pq->_head ;
assert(pq);
while(cur)
{
struct QueueNode* next = cur->_next ;
free(cur);
cur = next;
}
pq->_head = pq->_tail = NULL;
}
//创建结点
QueueNode* BuyQueueNode(QUDataType x)
{
QueueNode* node = (QueueNode*)malloc(sizeof(QueueNode));
node->_data = x;
node->_next = NULL;
return node;
}
//插入结点
void QueuePush(Queue* pq, QUDataType x)
{
assert(pq);
/*QueueNode* newnode = (QueueNode*)malloc(sizeof(QueueNode)); 一样的代码,上面就是自己定义了一个
newnode->_data = x;
newnode->_next = NULL;
if(pq->_tail == NULL)
{
pq->_tail = pq->_head = newnode;
}
else
{
pq->_tail ->_next = newnode;
pq->_tail = newnode;
}*/
if(pq->_head == NULL)
{
pq->_head = pq->_tail = BuyQueueNode(x);
}
else
{
pq->_tail ->_next = BuyQueueNode(x);
pq->_tail = pq->_tail ->_next ;
}
}
//删除结点
void QueuePop(Queue* pq)
{
assert(pq);
if(pq->_head )
{
QueueNode* next = pq->_head ->_next ;
free(pq->_head );
pq->_head = next ;
if(pq->_head == NULL)
{
pq->_tail = NULL;
}
}
}
//结点数目
int QueueSize(Queue* pq)
{
int size = 0;
struct QueueNode* cur = pq->_head ;
assert(pq);
while(cur != NULL)
{
++size;
cur = cur->_next ;
}
return size;
}
//判断是否为空
int QueueEmpty(Queue* pq)
{
assert(pq);
return pq->_head == pq->_tail ? 0 : 1;
}
//求对头数据
QUDataType QueueFront(Queue* pq)
{
assert(pq);
return pq->_head ->_data ;
}
//求对尾数据
QUDataType QueueBack(Queue* pq)
{
assert(pq);
return pq->_tail ->_next ;
}
//输出队列
void QueuePrint(Queue* pq)
{
QueueNode* cur = pq->_head;
assert(pq);
while(cur != NULL)
{
printf("%d ",cur->_data);
cur = cur ->_next ;
}
printf("\n");
}
以上就是队列的实现所有代码。