栈和队列的基本

栈(Stack)是一种后进先出(LIFO, Last In First Out)的数据结构。元素的插入和删除操作只能在栈顶进行。常见的操作包括压栈(push)和弹栈(pop)。

队列(Queue)是一种先进先出(FIFO, First In First Out)的数据结构。元素的插入在队尾进行,删除在队头进行。常见的操作包括入队(enqueue)和出队(dequeue)。

操作方式的差异

栈的插入和删除操作均在栈顶完成。压栈操作将元素添加到栈顶,弹栈操作移除栈顶元素。栈不支持在中间或底部直接操作。

队列的插入操作在队尾完成,删除操作在队头完成。入队操作将元素添加到队尾,出队操作移除队头元素。队列不支持在中间直接操作。

应用场景的不同

栈常用于需要回溯或撤销的场景,如函数调用栈、括号匹配、表达式求值。递归算法的实现也依赖于栈。

队列常用于需要按顺序处理的场景,如任务调度、消息队列、广度优先搜索(BFS)。打印任务的管理也是队列的典型应用。

实现方式的差异

栈可以通过数组或链表实现。数组实现的栈需要预先分配固定大小,链表实现的栈可以动态扩展。栈的插入和删除操作时间复杂度均为 O(1)。

队列也可以通过数组或链表实现。数组实现的队列可能涉及循环队列以避免空间浪费,链表实现的队列可以动态扩展。队列的插入和删除操作时间复杂度均为 O(1)。

性能特点的对比

栈的插入和删除操作仅涉及栈顶指针的移动,性能高效且简单。栈的空间复杂度取决于存储的元素数量。

队列的插入和删除操作涉及队头和队尾指针的移动,性能同样高效。循环队列的实现可以优化数组空间利用率。

基于C++栈和队列的实例

以下是基于C++栈和队列的实例,涵盖基础操作、算法应用和实际场景。所有代码均遵循标准C++语法,可直接编译运行。

栈(Stack)实例

基础操作

#include <stack>
#include <iostream>
using namespace std;// 1. 栈的声明与压栈
stack<int> s;
s.push(10);
s.push(20);// 2. 弹栈并获取栈顶
int top = s.top();
s.pop();// 3. 检查栈是否为空
bool isEmpty = s.empty();// 4. 获取栈大小
size_t size = s.size();

算法应用

// 5. 括号匹配检查
bool isValid(string str) {stack<char> st;for (char c : str) {if (c == '(' || c == '{' || c == '[') st.push(c);else if (st.empty() || abs(c - st.top()) > 2) return false;else st.pop();}return st.empty();
}// 6. 逆波兰表达式求值
int evalRPN(vector<string>& tokens) {stack<int> s;for (string t : tokens) {if (isdigit(t.back())) s.push(stoi(t));else {int b = s.top(); s.pop();int a = s.top(); s.pop();if (t == "+") s.push(a + b);else if (t == "-") s.push(a - b);else if (t == "*") s.push(a * b);else s.push(a / b);}}return s.top();
}

进阶应用

// 7. 使用栈实现队列
class MyQueue {stack<int> in, out;
public:void push(int x) { in.push(x); }int pop() {if (out.empty()) while (!in.empty()) out.push(in.top()), in.pop();int x = out.top(); out.pop();return x;}
};// 8. 最小栈设计
class MinStack {stack<int> s, min_s;
public:void push(int x) {s.push(x);if (min_s.empty() || x <= min_s.top()) min_s.push(x);}void pop() {if (s.top() == min_s.top()) min_s.pop();s.pop();}int getMin() { return min_s.top(); }
};

队列(Queue)实例

基础操作

#include <queue>
#include <iostream>
using namespace std;// 1. 队列声明与入队
queue<int> q;
q.push(10);
q.push(20);// 2. 出队并获取队首
int front = q.front();
q.pop();// 3. 检查队列是否为空
bool isEmpty = q.empty();// 4. 获取队列大小
size_t size = q.size();

算法应用

// 5. 使用队列实现栈
class MyStack {queue<int> q;
public:void push(int x) {q.push(x);for (int i = 1; i < q.size(); ++i) q.push(q.front()), q.pop();}int pop() { int x = q.front(); q.pop(); return x; }
};// 6. 二叉树的层次遍历
void levelOrder(TreeNode* root) {queue<TreeNode*> q;if (root) q.push(root);while (!q.empty()) {TreeNode* node = q.front(); q.pop();cout << node->val << " ";if (node->left) q.push(node->left);if (node->right) q.push(node->right);}
}

实际场景

// 7. 循环队列实现
class CircularQueue {int *arr, front, rear, size;
public:CircularQueue(int k) : arr(new int[k]), front(-1), rear(-1), size(k) {}bool enQueue(int value) {if (isFull()) return false;if (isEmpty()) front = 0;rear = (rear + 1) % size;arr[rear] = value;return true;}
};// 8. 任务调度器
int leastInterval(vector<char>& tasks, int n) {queue<pair<int, int>> q;priority_queue<int> pq;unordered_map<char, int> cnt;for (char c : tasks) cnt[c]++;for (auto p : cnt) pq.push(p.second);int time = 0;while (!pq.empty() || !q.empty()) {time++;if (!pq.empty()) {int t = pq.top() - 1;pq.pop();if (t > 0) q.push({t, time + n});}if (!q.empty() && q.front().second == time) {pq.push(q.front().first);q.pop();}}return time;
}

完整项目实例

以下为可扩展的完整项目示例(需包含头文件):

浏览器历史记录(栈应用)

class BrowserHistory {stack<string> backStack, forwardStack;string current;
public:BrowserHistory(string homepage) : current(homepage) {}void visit(string url) {backStack.push(current);current = url;forwardStack = stack<string>();}string back(int s

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/91062.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/91062.shtml
英文地址,请注明出处:http://en.pswp.cn/web/91062.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《C++初阶之STL》【list容器:详解 + 实现】

【list容器&#xff1a;详解 实现】目录前言------------标准接口介绍------------标准模板库中的list容器是什么样的呢&#xff1f;1. 常见的构造2. 迭代器操作std::list::beginstd::list::endstd::list::rbeginstd::list::rend3. 容量的操作std::list::sizestd::list::empty…

【灰度实验】——图像预处理(OpenCV)

目录 1 灰度图 2 最大值法 3 平均值法 4 加权均值法 5 两个极端的灰度值 将彩色图转为灰度图地过程称为灰度化。 灰度图是单通道图像&#xff0c;灰度化本质就是将彩色图的三通道合并成一个通道的过程。三种合并方法&#xff1a;最大值法&#xff0c;平均值法和加权均值法…

【linux驱动开发】编译linux驱动程序报错:ERROR: Kernel configuration is invalid.

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录一、报错二、解决方法1.先编译linux内核源码2.再重新编译驱动程序一、报错 在编译驱动程序过程中&#xff0c;经常碰到的一个小问题&#xff1a; make -C /home/lu…

Java面试宝典:MySQL中的锁

InnoDB中锁的类型非常多,总体上可以如下分类: 这些锁都是做什么的?具体含义是什么?我们现在来一一学习。 1. 解决并发事务问题 我们已经知道事务并发执行时可能带来的各种问题。最大的一个难点是:一方面要最大程度地利用数据库的并发访问能力,另一方面又要确保每个用户…

设备识别最佳实践:四维交叉验证框架

设备识别最佳实践&#xff1a;四维交叉验证框架 1. MAC地址分析&#xff08;40%权重&#xff09; - 设备身份核验 核心方法&#xff1a; # MAC地址标准化&#xff08;OUI提取&#xff09; mac"B4:2E:99:FB:9D:78" oui$(echo $mac | tr -d : | cut -c 1-6 | tr a-f A-…

《Java 程序设计》第 9 章 - 内部类、枚举和注解

大家好&#xff0c;今天我们来学习《Java 程序设计》第 9 章的内容 —— 内部类、枚举和注解。这三个知识点是 Java 中提升代码灵活性和可读性的重要工具&#xff0c;在实际开发中非常常用。接下来我们逐一展开讲解&#xff0c;每个知识点都会配上可直接运行的代码示例&#xf…

CTF Misc入门篇

在CTF比赛中&#xff0c;misc方向是必考的一个方向&#xff0c;其中&#xff0c;图形隐写是最最常见的类型。 先从Misc开始入门&#xff0c;一般会借助CTF SHOW解题平台&#xff0c;解题&#xff0c;然后进行技巧总结。 目录 图片篇(基础操作) misc1 misc2 misc3 misc4 …

Vulnhub 02 Breakout靶机

一、信息收集 我是在仅主机模式下扫描的。 以此去访问端口。 80端口是上面的主页&#xff0c;查看一下源代码&#xff0c;发现了如下图所示的注释&#xff0c;翻译过来是&#xff1a;别担心&#xff0c;没有人会来这里&#xff0c;安全地与你分享我的访问权限&#xff0c;它是…

论文阅读:2024 arxiv AutoDefense: Multi-Agent LLM Defense against Jailbreak Attacks

总目录 大模型安全相关研究&#xff1a;https://blog.csdn.net/WhiffeYF/article/details/142132328 AutoDefense: Multi-Agent LLM Defense against Jailbreak Attacks https://arxiv.org/pdf/2403.04783#page9.14 https://www.doubao.com/chat/14064782214316034 文章目录…

Spring Boot 请求限流实战:基于 IP 的高效防刷策略

前言 互联网流量就像洪水猛兽,来得快去得也快。如果不给接口装个“限速阀”,服务器瞬间被刷爆,宕机成真,根本不稀奇。没有限流机制,系统就像没有刹车的赛车,跑得太快反而翻车。为了保证服务稳定、响应迅速,保护后端资源不被恶意请求掏空,限流成必备武器。 本篇文章将…

机器学习第二课之线性回归的实战技巧

1 线性回归简介 1 线性回归应用场景 线性回归是一种用于分析自变量与连续型因变量之间线性关系的模型&#xff0c;其核心是通过拟合线性方程(y w_1x_1 w_2x_2 ... w_nx_n b&#xff09;来预测因变量或解释自变量的影响。由于其简单、可解释性强的特点&#xff0c;线性回归…

【时时三省】(C语言基础)指向指针数据的指针变量

山不在高&#xff0c;有仙则名。水不在深&#xff0c;有龙则灵。 ----CSDN 时时三省在了解了指针数组的基础上&#xff0c;需要了解指向指针数据的指针变量&#xff0c;简称为指向指针的指针。怎样定义一个指向指针数据的指针变量呢?下面定义一个指向指针数据的指针变量&#…

前端css 的固定布局,流式布局,弹性布局,自适应布局,响应式布局

1. 固定布局容器的宽高是固定的&#xff0c;单位一般是px&#xff0c;不会随着屏幕大小变化2.流式布局&#xff08;百分比布局/vw&#xff09;vw: 视图宽度的百分比,1vw代表视窗宽度的1% vh: 视图高度的百分比,1vh代表视窗高度的1%特点: 宽度随屏幕大小变化单位用%或vw 高度通常…

python学习DAY26打卡

DAY 26 函数专题1&#xff1a;函数定义与参数 内容&#xff1a; 函数的定义 变量作用域&#xff1a;局部变量和全局变量 函数的参数类型&#xff1a;位置参数、默认参数、不定参数 传递参数的手段&#xff1a;关键词参数 传递参数的顺序&#xff1a;同时出现三种参数类型时…

echarts图表点击legend报错问题(折线图)

原因是&#xff1a;echats 实例&#xff0c;不能够用响应式变量去接收。<template><div class"attendance-chart"><div v-if"loading" class"loading">加载中...</div><div v-else-if"error" class"e…

Django模型开发:模型字段、元数据与继承全方位讲解

文章目录一、模型字段类型详解Django 与 MySQL 字段类型映射整数类型深度对比二、常用字段选项null 与 blank 的区别注释与帮助文本默认值设置日期时间特殊选项选项列表&#xff08;choices&#xff09;三、模型元数据与方法模型 Meta 类模型管理器&#xff08;Manager&#xf…

墨者:SQL注入实战-MySQL

1. 墨者学院&#xff1a;SQL注入实战-MySQL&#x1f680; 2. 实训重点目标✨ 目标一&#xff1a; 了解sqlmap的使用及其tamper插件的使用&#xff1b; 目标二&#xff1a; 了解base64编码及解码。 3. 解题方向&#x1f50d; 目标网站的id参数通过Base64编码传输&#xff0c;…

Milvus 实战全流程

&#x1f4da; 学习路径总览1. Milvus 基础知识什么是向量数据库&#xff1f;Milvus 的核心概念&#xff08;collection、field、index、partition、segment&#xff09;Milvus 和 Faiss、Annoy、HNSW 的区别2. 安装与部署Docker 快速部署 Milvus&#xff08;推荐&#xff09;本…

Mysql数据库基础(入门)

目录 一.认识Sql 1.什么是Sql 2.Sql的作用 3.Sql通用语法 4.Sql分类 二.数据库的操作&#xff08;DDL&#xff09; 1.创建数据库 2.显示/使用数据库 3.修改数据库 4.删除数据库 三.常用数据类型 1.数值类型 2.字符串类型 3.日期类型 4.详细的数据类型 四.表的操…

MySQL 锁机制 15 连问 · 面试速答版

一、脑图&#xff1a;锁全景&#xff08;先记结构&#xff0c;再填细节&#xff09; 锁层级 ├─ 表锁 │ ├─ 意向锁 IS / IX │ └─ 表锁 READ / WRITE └─ 行锁├─ 记录锁 Record├─ 间隙锁 Gap└─ 临键锁 Next-Key二、15 问 15 答&#xff08;面试官一问一…