队列

简介(Introduction)

队列是一种特殊的线性表,允许在表的前端 \(front\) 进行删除操作,而在表的后端 \(rear\) 进行插入操作。
进行插入操作的端称为队尾,进行删除操作的端称为队头。



描述(Description)

  • 队列是一种 先进先出 的结构
  • 类似于人们的排队,先排队的人一定是在队列的前面,会先离开;反之,后来排队的人一定在队列后面,会后离开。



示例(Example)

image



代码(Code)

// 循环队列
int q1[N], front1, rear1; // 1. front 指向第一个元素,rear 指向最后一个元素的下一个位置
int q2[N], front2, rear2 = -1; // 2. front 指向第一个元素,rear 指向最后一个元素

// 队列为空
front1 == rear1; // 1
front2 == (rear2 + 1) % N; // 2

// 判满
front1 == (rear1 + 1) % N; // 1
front2 == (rear2 + 2) % N; // 2

// 入队
q1[rear1 ++ ] = 1; // 1
rear1 %= N;

q2[ ++ rear2] = 1; // 2
rear2 %= N;

// 出队
front1 = (front1 + 1) % N;  // 1 = 2
front2 = (front2 + 1) % N;

// 队头
q1[front1]; // 1 == 2
q2[front2];

#include <cstdio>
#include <iostream>

using namespace std;

struct Node {
	int val;
	Node *next;

	Node() : next(NULL) {}
	Node(int _val) : val(_val), next(NULL) {}
};

void print(Node *front) {
	for (auto i = front; i->next; i = i->next) 
		cout << i->val << ' ';
	cout << endl;
}

int main() {
	Node *front = new Node(), *rear = front;

	// 入队
	rear->val = 1;
	rear = rear->next = new Node(); // rear 指向最后一个元素队下一个元素

	rear->val = 2;
	rear = rear->next = new Node();

	rear->val = 3;
	rear = rear->next = new Node();

	print(front);

	// 出队
	auto p = front;
	front = front->next;
	delete(p);
	print(front);

	// 队头
	cout << front->val << endl;

	return 0;
}

一般情况下,链式存储 的队列无需使用循环队列的形式。
其原因是:链式存储在插入、删除操作中没有空余的节点,不会造成空间浪费


posted @ 2023-04-30 23:48  TheoFan  阅读(9)  评论(0编辑  收藏  举报