队列的知识点
- 定义: 队列是只允许在一端进行插入操作,而在另一端进行删除操作的线性表.
- 队列属于是先进后出的线性表,这一点和栈相反.
- 允许插入元素的一头称队头, 允许插入的一端称为队尾.
可以把队列想象成一个排队的队伍,人在队伍尾巴加入,然后在队伍前面退出.当然前提是加入队伍就不能中途退出的.
另外要注意的是,队列本身就是循环队列,否则当队尾指针到末尾的时候总不能指向数组的外面对吧.
队列的抽象数据类型定义如下:
ADT 队列 (Queue)
Data
同线性表。元素具有相同的类型,相邻元素具有前驱和后继关系 。
Operation
InitQueue(*Q) :初始化操作,建立一个空队列Q。
DestroyQueue(*Q) :若队列Q存在,则销毁它。
ClearQueue(*Q) :将队列Q清空。
QueueEmpty(Q) :若队列Q为空,返回true,否则返回false。
GetHead(Q,*e) :若队列Q存在且非空,用e返回队列Q的队头元素。
EnQueue(*Q,e) :若队列Q存在,插入新元素e到队列Q中并成为对尾元素 。
DeQueue(*Q,*e) :删除队列Q中队头元素,并用e返回其值。
QueueLength(Q) :返回队列Q的元素个数
endADT
队列比较简单,内容很少,废话不多说,上代码:
// 队列的顺序存储操作
// Author:chao
// Date:2022.07.14
#include<iostream>
using namespace std;
#include<string>
#define MAXSIZE 20
typedef int ElemType; // 定义队列中的元素性质
//队列的顺序存储结构
struct SqQueue
{
ElemType data[MAXSIZE];
int front;
int rear; //尾指针
};
//循环队列的初始化
void InitQueue(SqQueue* Q)
{
Q->front = 0;
Q->rear = 0;
cout << "队列初始化。" << endl;
}
// 获取队列的长度根据长度计算公式(rear - front + QueueSize) % QueueSize
int QueueLength(SqQueue* Q)
{
return (Q->rear - Q->front + MAXSIZE) % MAXSIZE;
}
// 输入队列中的所有元素
void CoutQueue(SqQueue Q)
{
if (QueueLength == 0) cout << "队列为空" << endl;
int cur = Q.front;
cout << "当前队列元素如下:" << endl;
while (cur != Q.rear)
{
cout << Q.data[cur] << " ";
cur = (cur + 1) % MAXSIZE;
}
}
//入队列
void EnterQueue(SqQueue* Q)
{
//首先判断是否满队列,用公式:(rear + 1) % QueueSize == front
if ((Q->rear + 1) % MAXSIZE == Q->front) cout << "队列已满。" << endl;
int flag = 1;
int n;
int e;
while(flag)
{
cout << "请输入要入队元素的个数:" << endl;
cin >> n;
if (n > MAXSIZE || n > MAXSIZE - QueueLength(Q))
{
cout << "输入的数量太大,无法转载。请重新输入。";
}
else flag = 0;
}
for (int j = 0; j < n; j++)
{
cout << "请输入存入的数值: " <<" ";
cin >> e;
Q->data[Q->rear] = e;
Q->rear = (Q->rear + 1) % MAXSIZE;
cout << " 入列成功。" << endl;
}
}
// 出队列操作,在front队列头部删除
void DeQueue(SqQueue* Q)
{
if (Q->front == Q->rear) cout << "队列为空" << endl;
int e;
e = Q->data[Q->front];
cout << "队列元素 " << e << " 已被删除。";
Q->front = (Q->front + 1) % MAXSIZE;
}
int main() {
SqQueue queue;
InitQueue(&queue);
EnterQueue(&queue);
CoutQueue(queue);
DeQueue(&queue);
CoutQueue(queue);
system("pause");
return 0;
}