第四期 01季 C/C++数据结构 顺序队列的基本操作(循环队列)

本文介绍了一种基于数组实现的循环队列,并详细讲解了队列的基本操作,包括初始化、入队、出队、获取队列长度及判断队列是否为空等。通过具体的C++代码实现了这些操作,并提供了完整的示例。

本期关注点当然是我们的队列,队列是先进先出的。

1.从队头出队,队尾入队。

2.判断队列为空的条件:Q.rear==Q.front

3.判断队列为满的条件:(Q.rear+1)%MaxSize==Q.front

4.求取长度:q.rear-q.front

本次实训关注点在于循环队列,将普通的队列尾与头相连操作代码如下:

#include <iostream>
using namespace std;
#define MAXSIZE 100

typedef struct {
	char *elem;		//顺序栈动态分配空间
	int front;		//顺序队列先进先出,front做头指针(做删除),rear做尾指针(做插入)
	int rear;
}SqQueue;

void InitSqQueue(SqQueue &q) {
	q.elem = new char[MAXSIZE];					//1.分配空间
	if (!q.elem) cout << "分配空间失败!";		//判断分配空间是否成功
	q.front = q.rear = 0;						//2.队头队尾指针指向0,队列为空
	cout << "初始化成功" << endl;
}
void InsertSqQueue(SqQueue& q) {				//入队操作---入队rear的后面
	cout << "入队操作,请输入入队个数:";
	int n; cin >> n;
	cout << "再输入要入队的元素:";
	for (int i = 0; i < n; i++){
		char e; cin >> e;
		if ((q.rear + 1) % MAXSIZE == q.front) {//判断队列是否已满
			cout << "队列满喽~"; 
		}
		else {									//如果未满,将元素直接放置顺序尾指针下表下
			q.elem[q.rear] = e;
			q.rear = (q.rear + 1) % MAXSIZE;	//循环队列的尾下表+1
		}
	}
}
void DeQueue(SqQueue& q) {
	if (q.front==q.rear){
		cout << "队列是空的,无法出队!";
	}
	else{
		cout << "请输入你要出队元素的个数:";
		int n; cin >> n;
		cout << "出队元素为:";
		for (int i = 0; i < n; i++){
			char e;
			e = q.elem[q.front]; cout << e << " ";
			q.front = (q.front + 1) % MAXSIZE;			//头指针+1
		}
		cout << endl;
	}
}
void LengthSqQueue(SqQueue &q) {
	cout << "顺序栈的长度为:" << (q.rear - q.front + MAXSIZE) % MAXSIZE << endl;;		//循环队列的情况下
	//q.rear - q.front; 非循环队列的情况下
}
void EmptySqQueue(SqQueue& q) {
	if (q.front==q.rear)	{
		cout << "队列是空的!" << endl;
	}
	else {
		cout << "队列不为空!" << endl;
	}
}
void GetHead(SqQueue& q) {
	if (q.front!=q.rear)	{	//队列不为空时 取队列头元素
		cout << "队头元素为:" << q.elem[q.front] << endl;//返回头元素指针下表
	}
	else{
		cout << "队列为空,无头元素!" << endl;
	}
}
int main() {
	SqQueue q;
	cout << "1.初始化:";
	InitSqQueue(q);

	cout << "2.";
	InsertSqQueue(q);

	cout << "3.";
	LengthSqQueue(q);

	cout << "4.";
	GetHead(q);

	cout << "5.";
	DeQueue(q);

	cout << "6.";
	EmptySqQueue(q);
}

代码运行截图:

 

 

<think>我们根据给定的引用内容来解答关于C++优先队列基本操作的问题。引用中提到了优先队列基本操作,包括构造、插入、访问队头元素、判空、大小、弹出等。 根据引用[3]:c++优先队列基本操作包括: - top: 访问队头元素 - empty: 判断队列是否为空 - size: 返回队列内元素个数 - push: 插入元素到队尾(并排序) - emplace: 原地构造一个元素并插入队列 - pop: 弹出队头元素 - swap: 交换内容 此外,引用[1]提到优先队列默认是大顶堆(降序队列),即队头元素最大。如果需要小顶堆(升序队列),可以通过自定义比较函数或使用标准库提供的比较函数(如greater)来实现。 下面我们将详细介绍这些基本操作的使用方法,并给出示例代码。 </think>### C++优先队列基本操作详解 在C++标准库中,优先队列(`priority_queue`)通过`<queue>`头文件提供,是一种容器适配器,默认实现为大顶堆(最大元素位于队首)。以下是其基本操作及使用方法: #### 1. **基本操作** 根据引用[3]和引用[5]: - **`push(element)`** 插入元素到队列中,并自动排序 示例:`pq.push(10);` - **`pop()`** 移除队首元素(最高优先级元素) 示例:`pq.pop();` - **`top()`** 访问队首元素(不删除) 示例:`int x = pq.top();` - **`empty()`** 检查队列是否为空 示例:`if (pq.empty()) {...}` - **`size()`** 返回队列元素数量 示例:`int count = pq.size();` #### 2. **队列构造** ```cpp // 默认大顶堆(降序) priority_queue<int> pq; // 小顶堆(升序),需指定比较函数 priority_queue<int, vector<int>, greater<int>> min_pq; ``` > 引用[2]和[5]说明:通过模板参数`greater<int>`可切换为小顶堆,`vector<int>`是底层容器。 #### 3. **自定义比较规则** 对于自定义数据类型(如结构体),需实现比较函数: ```cpp struct Node { int value; // 重载<运算符(大顶堆) bool operator<(const Node& n) const { return value < n.value; // 大顶堆规则 } }; priority_queue<Node> custom_pq; ``` 或使用Lambda表达式(需C++11以上): ```cpp auto cmp = [](int a, int b) { return a*a > b*b; }; // 按平方值升序 priority_queue<int, vector<int>, decltype(cmp)> pq(cmp); ``` > 引用[5]强调:自定义比较函数需返回`bool`,且满足严格弱序关系[^5]。 #### 4. **完整示例** ```cpp #include <iostream> #include <queue> using namespace std; int main() { // 大顶堆 priority_queue<int> max_pq; max_pq.push(30); max_pq.push(10); max_pq.push(20); cout << &quot;大顶堆输出: &quot;; while (!max_pq.empty()) { cout << max_pq.top() << &quot; &quot;; // 输出: 30 20 10 max_pq.pop(); } // 小顶堆 priority_queue<int, vector<int>, greater<int>> min_pq; min_pq.push(30); min_pq.push(10); min_pq.push(20); cout << &quot;\n小顶堆输出: &quot;; while (!min_pq.empty()) { cout << min_pq.top() << &quot; &quot;; // 输出: 10 20 30 min_pq.pop(); } return 0; } ``` > 引用[2]和[4]展示了类似的测试逻辑[^2][^4]。 #### 5. **注意事项** - 时间复杂度:`push/pop`操作 $O(\log n)$,`top`操作 $O(1)$ - 引用[1]指出:相同优先级元素的顺序不保证稳定,需自定义比较函数控制[^1] - `emplace()` 可直接构造元素,避免拷贝开销(C++11+)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

赵相机~

谢谢你,调试、讲解私聊我~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值