1. 熟悉队列的基本概念
队列是一种先进先出的线性表,它只允许在表的一端进行插入,而在另一端删除元素,允许
允许插入的一端叫队尾,允许删除的一端叫对头.
2. 队列的性质
队列具有先进先出的特性。
3. 队列存储结构
顺序队列
队头指针不动----要大量搬移元素
缺陷:操作时如果出队列比较多,要搬移大量元素。
队头指针移动----存在假溢出
假溢出:顺序队列因多次入队列和出队列操作后出现的尚有存储空间但不能再进行入队列操作
的溢出。
真溢出:顺序队列最大存储空间已经存满而有要求进入队列操作所引起的溢出。
循环队列
循环队列如何解决队列空或者满?
1.少用一个存储单元
2.设置一个标志位
3.设置一个计数器
链式队列---用链表作为队列的底层数据结构
实现链式队列的以下操作:
typedef int DataType;
typedef struct Node
{
DataType _data;
struct Node* _pNext;
}Node, *PNode;
typedef struct Queue
{
PNode _pHead;
PNode _pTail;
}Queue;
// 队列的初始化
void QueueInit(Queue* q);
// 入队列
void QueuePush(Queue* q, DataType data);
// 出队列
void QueuePop(Queue* q);
// 取队头元素
DataType QueueFront(Queue* q);
// 取队尾元素
DataType QueueBack(Queue* q);
// 获取队列中元素的个数
int QueueSize(Queue* q);
// 检测队列是否为空
int QueueEmpty(Queue* q);
#include"Queue.h"
#include<stdio.h>
#include<assert.h>
#include<malloc.h>
typedef int DataType;
typedef struct Node
{
DataType _data;
struct Node* _pNext;
}Node, *PNode;
typedef struct Queue
{
PNode _pHead;
PNode _pTail;
}Queue;
PNode BuyNode(DataType data)
{
PNode pNewNode=(PNode*)malloc(sizeof(Node));
if(NULL==pNewNode)
{
assert(0);
return NULL;
}
pNewNode->_data=data;
pNewNode->_pNext=NULL;
return pNewNode;
}
void QueueInit(Queue* q) //队列的初始化
{
assert(q);
q->_pHead=q->_pTail=NULL;
}
void QueuePush(Queue* q, DataType data) //入队列
{
assert(q);
if(NULL==q->_pHead)
{
q->_pHead=q->_pHead=BuyNode(data);
}
else
{
q->_pTail->_pNext=BuyNode(data);
q->_pHead=q->_pTail->_pNext;
}
void QueuePop(Queue* q)// 出队列
{PNode pDelNode=q->_pHead;
//assert(q);
if(!pDelNode)
{
q->pHead=pDelNode->_pNext;
free(pDelNode);
}
}
DataType QueueFront(Queue* q) //取队头元素
{
assert(q);
return q->_pHead->_data;
}
DataType QueueBack(Queue* q)// 取队尾元素
{ assert(q);
return q->_pTail->_data;
}
int QueueSize(Queue* q)//获取队列中元素的个数
{
PNode pCur=q->pHead;
int count=0;
while(pCur)
{
count++;
pCur=pCur->_pNext;
}
return count;
}
int QueueEmpty(Queue* q)//检测队列是否为空
{
return NULL==q->_pHead;
}
队列是一种先进先出的线性表,它只允许在表的一端进行插入,而在另一端删除元素,允许
允许插入的一端叫队尾,允许删除的一端叫对头.
2. 队列的性质
队列具有先进先出的特性。
3. 队列存储结构
顺序队列
队头指针不动----要大量搬移元素
缺陷:操作时如果出队列比较多,要搬移大量元素。
队头指针移动----存在假溢出
假溢出:顺序队列因多次入队列和出队列操作后出现的尚有存储空间但不能再进行入队列操作
的溢出。
真溢出:顺序队列最大存储空间已经存满而有要求进入队列操作所引起的溢出。
循环队列
循环队列如何解决队列空或者满?
1.少用一个存储单元
2.设置一个标志位
3.设置一个计数器
链式队列---用链表作为队列的底层数据结构
实现链式队列的以下操作:
typedef int DataType;
typedef struct Node
{
DataType _data;
struct Node* _pNext;
}Node, *PNode;
typedef struct Queue
{
PNode _pHead;
PNode _pTail;
}Queue;
// 队列的初始化
void QueueInit(Queue* q);
// 入队列
void QueuePush(Queue* q, DataType data);
// 出队列
void QueuePop(Queue* q);
// 取队头元素
DataType QueueFront(Queue* q);
// 取队尾元素
DataType QueueBack(Queue* q);
// 获取队列中元素的个数
int QueueSize(Queue* q);
// 检测队列是否为空
int QueueEmpty(Queue* q);
#include"Queue.h"
#include<stdio.h>
#include<assert.h>
#include<malloc.h>
typedef int DataType;
typedef struct Node
{
DataType _data;
struct Node* _pNext;
}Node, *PNode;
typedef struct Queue
{
PNode _pHead;
PNode _pTail;
}Queue;
PNode BuyNode(DataType data)
{
PNode pNewNode=(PNode*)malloc(sizeof(Node));
if(NULL==pNewNode)
{
assert(0);
return NULL;
}
pNewNode->_data=data;
pNewNode->_pNext=NULL;
return pNewNode;
}
void QueueInit(Queue* q) //队列的初始化
{
assert(q);
q->_pHead=q->_pTail=NULL;
}
void QueuePush(Queue* q, DataType data) //入队列
{
assert(q);
if(NULL==q->_pHead)
{
q->_pHead=q->_pHead=BuyNode(data);
}
else
{
q->_pTail->_pNext=BuyNode(data);
q->_pHead=q->_pTail->_pNext;
}
void QueuePop(Queue* q)// 出队列
{PNode pDelNode=q->_pHead;
//assert(q);
if(!pDelNode)
{
q->pHead=pDelNode->_pNext;
free(pDelNode);
}
}
DataType QueueFront(Queue* q) //取队头元素
{
assert(q);
return q->_pHead->_data;
}
DataType QueueBack(Queue* q)// 取队尾元素
{ assert(q);
return q->_pTail->_data;
}
int QueueSize(Queue* q)//获取队列中元素的个数
{
PNode pCur=q->pHead;
int count=0;
while(pCur)
{
count++;
pCur=pCur->_pNext;
}
return count;
}
int QueueEmpty(Queue* q)//检测队列是否为空
{
return NULL==q->_pHead;
}