文章目录
- 指针
-
- 例一
- 例二
- 线性队列
-
- 队列手动实现
- stl队列
- 循环队列
-
- 定义
- 代码实现
- 真题
- 优先队列
指针
文章图片
例一
文章图片
输出:102030200
说明:
文章图片
例二
文章图片
输出:65 A
线性队列 队列手动实现
文章图片
文章图片
stl队列 【麦克算法|4指针与队列】
文章图片
循环队列 定义
文章图片
代码实现
#include
#include
#define MAXSIZE 100 //最大队列长度
#define OK 1
#define ERROR 0
typedef int ElemType;
typedef int Status;
typedef struct {
ElemType *base;
//队列空间
int front;
//队头指针
int rear;
//队尾指针,若队尾不为空,则指向队尾元素的下一个位置
}
SqQueue;
//初始化循环队列
Status initQueue(SqQueue &Q) {
Q.base = (ElemType *) malloc(MAXSIZE * sizeof(ElemType));
//申请空间
Q.front = Q.rear = 0;
//队空
return OK;
}
//入队
Status enQueue(SqQueue &Q, ElemType e) {
if ((Q.rear + 1) % MAXSIZE == Q.front) return ERROR;
//队满,无法添加
Q.base[Q.rear] = e;
//插入元素
Q.rear = (Q.rear + 1) % MAXSIZE;
//队尾指针+1
return OK;
}
//出队
Status deQueue(SqQueue &Q, ElemType &e) {
if (Q.front == Q.rear) return ERROR;
//队空,无法删除
e = Q.base[Q.front];
Q.front = (Q.front + 1) % MAXSIZE;
//队头指针+1
return OK;
}
//返回队列长度
Status length(SqQueue &Q) {
return (Q.rear - Q.front + MAXSIZE) % MAXSIZE;
}
真题
文章图片
typedef struct {
ElemType *elem;
//队列空间
int front;
//队头指针
int rear;
//队尾指针,若队尾不为空,则指向队尾元素的下一个位置
}
CTagQueue;
//判满
bool Full(CTagQueue Q) {
if(Q.tag==1 && Q.front==Q.rear)
return true;
return false;
}
//判空
bool Empty(CTagQueue Q) {
if(Q.tag==0 && Q.front==Q.rear)
return true;
return false;
}
//插入元素 x
status EnCQueue(CTagQueue &Q,ElemType x) {
if(Full(Q)) {
return ERROR;
}
Q.elem[Q.rear] = x;
Q.rear=(Q.rear+1)%Q.maxSize;
if(Q.rear == Q.front) Q.tag=1;
return OK;
}
//出队
Status DeCQueue(CTagQueue &Q,ElemType &x) {
If(Empty(Q))
return ERROR;
x=Q.elem[Q.front];
Q.front=(Q.front+1)%Q.maxSize;
if(Q.front==Q.rear) Q.tag=0;
return OK;
}
优先队列
//大顶堆 = 最大优先队列 -> 最大元素优先出队
// 这里一定要有空格,不然成了右移运算符↓↓
priority_queue , less > q;
priority_queue q;
//默认大顶堆,故可以这样简写//小顶堆 = 最小优先队列 -> 最小元素优先出队
// 这里一定要有空格,不然成了右移运算符↓↓
priority_queue , greater > q;
#include
#include
using namespace std;
int main() {
//对于基础类型 默认是大顶堆
priority_queue a;
//等同于 priority_queue, less > a;
// 这里一定要有空格,不然成了右移运算符↓↓
priority_queue, greater > c;
//这样就是小顶堆
priority_queue> b;
for (int i = 0;
i < 5;
i++) {
a.push(i);
c.push(i);
}
while (!a.empty()) {
cout << a.top() << ' ';
a.pop();
}
cout << endl;
while (!c.empty()) {
cout << c.top() << ' ';
c.pop();
}
cout << endl;
b.push("abc");
b.push("abcd");
b.push("cbd");
while (!b.empty()) {
cout << b.top() << ' ';
b.pop();
}
cout << endl;
return 0;
}
具体的内容后续会讲到…
推荐阅读
- 个人日记|K8s中Pod生命周期和重启策略
- 学习分享|【C语言函数基础】
- C++|C++浇水装置问题
- 数据结构|C++技巧(用class类实现链表)
- C++|从零开始学C++之基本知识
- 步履拾级杂记|VS2019的各种使用问题及解决方法
- leetcode题解|leetcode#106. 从中序与后序遍历序列构造二叉树
- 动态规划|暴力递归经典问题
- 代码狂魔|实战证明java中的两把锁ReentrantLock与synchronized的系统调用