列,它支持以下操作: 入队:将一个元素加入到队列的末尾。 出队:将队列中的第一个元素删除并返回。 获取队列头部元素:返回队列中的第一个元素但不删除。 获取队列长度:返回队列中元素的个数。 请问,如何使用数组或链表实现这个队列?
时间: 2024-05-14 15:16:16 浏览: 101
使用数组实现队列的基本思路是:用一个数组来保存队列中的元素,用 front 和 rear 分别表示队列头和尾的下标,当 front = rear 时表示队列为空。具体实现可以采用循环数组的方式,将 rear 指向下一个位置。
具体的操作实现如下:
1. 入队操作:将元素插入到数组的 rear 位置,然后将 rear 指向下一个位置。
```
void enqueue(int value) {
if (rear == MAX_SIZE) {
printf("Queue is full\n");
return;
}
queue[rear++] = value;
}
```
2. 出队操作:将 front 指向下一个位置,然后返回原来的 front 所指向的元素。
```
int dequeue() {
if (front == rear) {
printf("Queue is empty\n");
return -1;
}
return queue[front++];
}
```
3. 获取队列头部元素:直接返回 front 所指向的元素。
```
int front() {
if (front == rear) {
printf("Queue is empty\n");
return -1;
}
return queue[front];
}
```
4. 获取队列长度:直接返回 rear - front 即可。
```
int size() {
return rear - front;
}
```
使用链表实现队列的基本思路是:用一个链表来保存队列中的元素,用 head 和 tail 分别表示队列头和尾的指针,当 head = tail 时表示队列为空。具体实现可以在链表尾部添加元素,然后将 tail 指向新添加的元素。
具体的操作实现如下:
1. 入队操作:在链表尾部添加元素,然后将 tail 指向新添加的元素。
```
void enqueue(int value) {
Node* newNode = new Node(value);
if (tail == nullptr) {
head = tail = newNode;
} else {
tail->next = newNode;
tail = newNode;
}
}
```
2. 出队操作:将 head 指向下一个位置,然后返回原来的 head 所指向的元素。
```
int dequeue() {
if (head == nullptr) {
printf("Queue is empty\n");
return -1;
}
int value = head->value;
Node* temp = head;
head = head->next;
delete temp;
if (head == nullptr) {
tail = nullptr;
}
return value;
}
```
3. 获取队列头部元素:直接返回 head 所指向的元素。
```
int front() {
if (head == nullptr) {
printf("Queue is empty\n");
return -1;
}
return head->value;
}
```
4. 获取队列长度:遍历整个链表,统计元素个数即可。
```
int size() {
int count = 0;
Node* curr = head;
while (curr != nullptr) {
count++;
curr = curr->next;
}
return count;
}
```
阅读全文