大师兄的数据结构学习笔记(二):线性结构
大师兄的数据结构学习笔记(四):树结构
一、什么是队列(Queue)
- 队列是具有一定操作约束的线性表。
- 只在一端(队尾)插入/入队列,在另一端(队头)删除/出队列。
- 先入先出:First In First OUT (FIFO)。
![](https://img.haomeiwen.com/i19742364/927eb9e01048dde4.png)
二、队列的抽象数据类型描述
- 数据对象集: 一个有0个或多个元素的有穷线性表。
- 操作集: 长度为MaxSize的队列
,队列元素
操作 | 含义 |
---|---|
Queue CreateQueue(int MaxSize) | 生成长度为MaxSize的空队列。 |
int IsFull(Queue Q,int MaxSIze) | 判断队列Q是否已满。 |
void AddQ(Queue Q,ElementType item) | 将数据元素item插入队列Q中。 |
int IsEmpty(Stack S) | 判断队列Q是否为空。 |
ElementType DeleteQ(Queue Q) | 将队头数据元素从队列中删除并返回。 |
三、队列的顺序存储实现
- 队列的顺序存储通常由一个一维数组、一个记录队列头元素位置的变量front、一个记录队列尾元素位置的变量rear组成。
#ifndef QUEUE_H
#define QUEUE_H
typedef int DataType;
const int MaxSize = 100;
class Queue
{
public:
Queue() {}; //生成长度为MaxSize的空队列
bool IsFull(); //判断队列Q是否已满
void AddQ(DataType item); //将数据元素item插入队列Q中
bool IsEmpty(); //判断队列Q是否为空
DataType DeleteQ(); //将队头数据元素从队列中删除并返回
private:
DataType data[MaxSize];
int front;
int rear;
};
#endif
#include <iostream>
#include "Queue.h"
using namespace std;
bool Queue::IsFull()
{
//判断队列Q是否已满
if ((rear + 1) % MaxSize == front) {
return true;
}
return false;
}
bool Queue::IsEmpty()
{
//判断队列Q是否为空
if (rear == front)
{
return true;
}
return false;
}
void Queue::AddQ(DataType item)
{
//将数据元素item插入队列Q中
if (IsFull())
{
printf("Queue is full!");
return;
}
rear = (rear + 1) % MaxSize;
data[rear] = item;
}
DataType Queue::DeleteQ()
{
//将队头数据元素从队列中删除并返回
if (IsEmpty())
{
printf("Queue is empty!");
return 0;
}
else {
front = (front + 1) % MaxSize;
return data[front];
}
}
四、队列的链式存储实现
-
用一个单链表实现,链表头作为front,链表末尾作为rear。
#ifndef QUEUE_H
#define QUEUE_H
typedef int DataType;
typedef struct Node {
//链表数据结构
DataType Data;
struct Node *Next;
}QNode;
class Queue
{
public:
Queue() {}; //构造函数
void AddQ(DataType item); //将数据元素item插入队列Q中
bool IsEmpty(); //判断队列Q是否为空
DataType DeleteQ(); //将队头数据元素从队列中删除并返回
private:
//链表队列结构
QNode *front;
QNode *rear;
};
#endif
#include <iostream>
#include "Queue.h"
using namespace std;
bool Queue::IsEmpty()
{
//判断队列Q是否为空
if (front==nullptr)
{
return true;
}
return false;
}
void Queue::AddQ(DataType item)
{
//将数据元素item插入链表尾部
QNode* RearCell = new QNode;
RearCell->Data = item;
RearCell->Next = nullptr;
if (IsEmpty())
rear = front = RearCell;
else
rear->Next = RearCell;
rear = RearCell;
}
DataType Queue::DeleteQ()
{
//将队头数据元素从队列中删除并返回
QNode *FrontCell;
DataType FrontElem;
if (IsEmpty())
{
printf("Queue is empty!");
return 0;
}
FrontCell = front;
if (front == rear)
//如果只有一个元素,表头为空
front = nullptr;
else
//如果超过一个元素,则指向上一个元素并释放当前元素空间
front = front->Next;
FrontElem = FrontCell->Data;
free(FrontCell);
return FrontElem;
}
网友评论