C++线性表:队列详解
作者:野牛程序员:2023-02-24 22:45:39C++程序设计阅读 2570
队列(Queue)是一种线性数据结构,它具有先进先出(First-In-First-Out,FIFO)的特点,即最先进入队列的元素最先被取出。队列可以通过数组或链表实现。
在 C++ 中,队列可以使用标准库中的 queue 类实现,该类位于头文件 <queue> 中,具有以下常用成员函数:
push():将元素加入队列的末尾
pop():将队列的首元素删除
front():返回队列的首元素
back():返回队列的末尾元素
size():返回队列中元素的个数
empty():判断队列是否为空
下面是使用 queue 类实现队列的示例代码:
#include <iostream>
#include <queue>
using namespace std;
int main() {
queue<int> q;
q.push(1);
q.push(2);
q.push(3);
cout << "队列大小:" << q.size() << endl;
cout << "队列首元素:" << q.front() << endl;
cout << "队列末尾元素:" << q.back() << endl;
q.pop();
cout << "队列大小:" << q.size() << endl;
cout << "队列首元素:" << q.front() << endl;
cout << "队列末尾元素:" << q.back() << endl;
return 0;
}输出结果为:
队列大小:3 队列首元素:1 队列末尾元素:3 队列大小:2 队列首元素:2 队列末尾元素:3
除了标准库中的 queue 类,我们也可以使用数组或链表实现队列,具体实现可以参考以下示例代码:
使用数组实现队列:
#include <iostream>
using namespace std;
const int MAXSIZE = 100; // 队列最大长度
class Queue {
public:
Queue() : head(0), tail(0) {}
bool enqueue(int x) {
if (tail == MAXSIZE) {
return false; // 队列已满
}
q[tail++] = x;
return true;
}
bool dequeue(int& x) {
if (head == tail) {
return false; // 队列已空
}
x = q[head++];
return true;
}
bool empty() const {
return head == tail;
}
int size() const {
return tail - head;
}
private:
int q[MAXSIZE]; // 队列数组
int head; // 队列头指针
int tail; // 队列尾指针
};
int main() {
Queue q;
q.enqueue(1);
q.enqueue(2);
q.enqueue(3);
cout << "队列大小:" << q.size() << endl;
int x;
q.dequeue(x);
cout << "出队元素:" << x << endl;
cout << "队列大小:" << q.size() << endl;
return 0;
}使用链表实现队列:
#include <iostream>
using namespace std;
class Node {
public:
Node(int x) : val(x), next(nullptr) {}
int val;
Node* next;
};
class Queue {
public:
Queue() : head(nullptr), tail(nullptr) {}
bool enqueue(int x) {
Node* node = new Node(x);
if (head == nullptr) {
head = node;
tail = node;
} else {
tail->next = node;
tail = node;
}
return true;
}
bool dequeue(int& x) {
if (head == nullptr) {
return false; // 队列已空
}
x = head->val;
Node* tmp = head;
head = head->next;
delete tmp;
return true;
}
bool empty() const {
return head == nullptr;
}
int size() const {
int cnt = 0;
Node* p = head;
while (p != nullptr) {
cnt++;
p = p->next;
}
return cnt;
}
private:
Node* head; // 队列头指针
Node* tail; // 队列尾指针
};
int main() {
Queue q;
q.enqueue(1);
q.enqueue(2);
q.enqueue(3);
cout << "队列大小:" << q.size() << endl;
int x;
q.dequeue(x);
cout << "出队元素:" << x << endl;
cout << "队列大小:" << q.size() << endl;
return 0;
}输出结果为:
队列大小:3 出队元素:1 队列大小:2
以上是使用数组或链表手动实现队列的示例代码,需要注意的是,手动实现队列需要自行处理队列空和队列满的情况,而使用标准库中的 queue 类则不需要考虑这些问题,因为 queue 类已经封装好了相关的处理。
野牛程序员教少儿编程与信息学奥赛-微信|电话:15892516892

