21 - 队列 - 循环队列——队列的顺序表示和实现
发布人:shili8
发布时间:2025-01-08 00:46
阅读次数:0
**队列**
队列是一种线性数据结构,遵循先进先出(FIFO)原则。它允许添加元素到末尾,并从头部取出元素。在本文中,我们将讨论队列的顺序表示和实现。
### 队列的顺序表示队列可以使用数组或链表来实现。下面是队列的基本操作:
* **enqueue(x)**:向队列末尾添加一个新元素x。
* **dequeue()**:从队列头部取出一个元素,并返回它。
* **peek()**:查看队列头部的元素,但不移除它。
### 队列的实现#### 数组实现我们可以使用数组来实现队列。下面是C++代码示例:
cppclass Queue {
private:
int *data;
int front, rear, size;
public:
Queue(int capacity) : data(new int[capacity]), front(0), rear(0), size(0) {}
~Queue() { delete[] data; }
void enqueue(int x) {
if (size == data.length()) {
// Handle queue overflow return;
}
data[rear++] = x;
size++;
}
int dequeue() {
if (isEmpty()) {
// Handle empty queue return -1;
}
int x = data[front++];
size--;
return x;
}
int peek() {
if (isEmpty()) {
// Handle empty queue return -1;
}
return data[front];
}
bool isEmpty() { return size ==0; }
};
#### 链表实现我们也可以使用链表来实现队列。下面是C++代码示例:
cppclass Node {
public:
int data;
Node *next;
Node(int x) : data(x), next(nullptr) {}
};
class Queue {
private:
Node *head, *tail;
public:
void enqueue(int x) {
Node *node = new Node(x);
if (isEmpty()) {
head = tail = node;
} else {
tail->next = node;
tail = node;
}
}
int dequeue() {
if (isEmpty()) {
// Handle empty queue return -1;
}
int x = head->data;
Node *temp = head;
head = head->next;
delete temp;
return x;
}
int peek() {
if (isEmpty()) {
// Handle empty queue return -1;
}
return head->data;
}
bool isEmpty() { return head == nullptr; }
};
### 循环队列循环队列是一种特殊的队列,它允许在队列末尾添加元素时,自动将头部指针移动到队列开始处。这样可以避免队列溢出的问题。
下面是C++代码示例:
cppclass CircularQueue {
private:
int *data;
int front, rear, size;
public:
CircularQueue(int capacity) : data(new int[capacity]), front(0), rear(0), size(0) {}
~CircularQueue() { delete[] data; }
void enqueue(int x) {
if (size == data.length()) {
// Handle queue overflow return;
}
data[rear++] = x;
if (rear == data.length()) {
rear =0;
}
size++;
}
int dequeue() {
if (isEmpty()) {
// Handle empty queue return -1;
}
int x = data[front++];
if (front == data.length()) {
front =0;
}
size--;
return x;
}
int peek() {
if (isEmpty()) {
// Handle empty queue return -1;
}
return data[front];
}
bool isEmpty() { return size ==0; }
};
### 总结在本文中,我们讨论了队列的顺序表示和实现。我们使用数组或链表来实现队列,并提供了C++代码示例。我们还讨论了循环队列,它允许自动将头部指针移动到队列开始处,避免队列溢出的问题。

