(第二章一一栈与队列)第三节 队列的顺序存储结构C++

队列的知识点

  • 定义: 队列是只允许在一端进行插入操作,而在另一端进行删除操作的线性表.
  • 队列属于是先进后出的线性表,这一点和栈相反.
  • 允许插入元素的一头称队头, 允许插入的一端称为队尾.

可以把队列想象成一个排队的队伍,人在队伍尾巴加入,然后在队伍前面退出.当然前提是加入队伍就不能中途退出的.
另外要注意的是,队列本身就是循环队列,否则当队尾指针到末尾的时候总不能指向数组的外面对吧.

队列的抽象数据类型定义如下:

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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值