当前位置: 首页 > news >正文

【C++】stack与queue的使用与模拟实现

在这里插入图片描述

【C++】stack与queue的使用与模拟实现

前言:在C++ STL中,stack和queue是两个重要的数据结构组件,它们虽然简单却非常实用。与vector、list等容器不同,它们属于容器适配器,通过封装现有容器并提供特定接口来实现栈和队列的功能。接下来,让我们一起学习一下吧!!!
📖专栏:【C++成长之旅】


目录

  • 【C++】stack与queue的使用与模拟实现
    • 一、stack与queue使用
    • 二、stack模拟实现
    • 三、queue模拟实现


说在前面

对于stack与queue的学习更为简单,但是它们与前面的string、vector……还是有本质区别,string是容器(container ),stack与queue是容器适配器(container adaptor):
在这里插入图片描述
是因为它在现有容器的基础上,通过限制功能、改变接口,来“适配”出栈这种特定的数据结构。
也就是说,它的底层,可以是已有的容器,比如:list、vector……
关于容器适配器我会在下篇博客中来详细阐述,敬请期待,现在让我们来学习stack与queue吧。

对于stack和queue的思想,学过数据结构的都知道了,没学过的话也可以看看【栈与队列】。

一、stack与queue使用

【stack的参考文档】
【queue的参考文档】
两者的接口都很简单,我们要不展开说明了,来简单应用一下吧。

// stack使用示例
#include <stack>
#include <iostream>
using namespace std;int main() {stack<int> st;st.push(1);st.push(2);st.push(3);while (!st.empty()) {cout << st.top() << " ";  // 输出: 3 2 1st.pop();}return 0;
}

输出:3 2 1
接着就直接来看几个相对应的题吧:
题1:《用栈实现队列》
这个题很简单,但是我们要来体会C++中STL的方便,假设我们用C语言来完成的话,首先要自己实现一个栈才可以解题,但C++不需要。
参考题解:

class MyQueue {
private:stack<int> inStack, outStack;void in2out() {while (!inStack.empty()) {outStack.push(inStack.top());inStack.pop();}}public:MyQueue() {}void push(int x) { inStack.push(x); }int pop() {if (outStack.empty()) {in2out();}int x = outStack.top();outStack.pop();return x;}int peek() {if (outStack.empty()) {in2out();}return outStack.top();}bool empty() { return inStack.empty() && outStack.empty(); }
};

有兴趣的自己也可以练练,STL我们要多使用才可以掌握,多练。
题2:《用队列实现栈》,有时间也可以练练

二、stack模拟实现

对于两者的模拟实现也很简单,前面说过,它们两者是容器适配器。
所以对于stack我们可以用vector来封装:

    template<class T, class Con = std::vector<T>>class stack{public:stack()  //默认构造函数{}void push(const T& x)  //入栈操作{_c.push_back(x);  //使用底层容器的push_back}void pop()  // 出栈操作{_c.pop_back();  // 使用底层容器的pop_back}T& top(){return _c.back();}const T& top()const{return _c.back();}size_t size()const{return _c.size();}bool empty()const{return _c.empty();}private:Con _c;};

怎么,是不是很简单,不要我们再像vector一样实现一个底层的结构。

三、queue模拟实现

对于queue,我们也可以用vector来封装,因为queue的接口中存在头删和尾插,因此使用vector来封装效率太低(vector在头部删除时需要移动所有后续元素,时间复杂度为O(n),而list的pop_front是O(1)操作。),故可以借助list来模拟实
现queue,具体如下:

    template<class T, class Con = std::list<T>>class queue{public:queue(){ }void push(const T& x){_c.push_back(x);}void pop(){_c.pop_front();}T& back(){return _c.back();}const T& back()const{return _c.back();}T& front(){return _c.front();}const T& front()const{return _c.front();}size_t size()const{return _c.size();}bool empty()const{return _c.empty();}private:Con _c;};

注意:
对于stack和queue的实现,官方的库中底层则是deque,但是鉴于我们可能不知道deque,下篇博客就会来说deque,但是实现是一样的,如果是deque,我们只需要把容器改为deque即可。


如果本文对您有启发:
点赞 - 让更多人看到这篇硬核技术解析 !
收藏 - 实战代码随时复现
关注 - 获取数据结构系列深度更新
您的每一个[三连]都是我们持续创作的动力!

请添加图片描述

http://www.dtcms.com/a/453037.html

相关文章:

  • JSDoc注释
  • 第4章:函数调用(Function Calling / Tool Calling)—让 AI 调用你的 API
  • LLaVA-Video论文阅读
  • 精品课程网站建设意义北京小程序网站制作
  • Mean Normalization|均值归一化
  • 可以做网站素材的服装手机安装wordpress
  • StarRocks 是如何进行并行计算
  • 私域整体结构的顶层设计:基于“开源AI智能名片链动2+1模式S2B2C商城小程序”的体系重构
  • 基于SpringBoot和Vue的超市管理系统
  • wordpress系统安装教程上海网站排名优化费用
  • 【线程池】——实用场景
  • ip address dhcp-alloc 概念及题目
  • 深入解析:JavaScript中typeof与instanceof的原理及区别
  • C++ 位运算 高频面试考点 力扣137. 只出现一次的数字 II 题解 每日一题
  • 商城网站开发与设计郑州seo外包阿亮
  • 自建本地DNS过滤系统:实现局域网广告和垃圾网站屏蔽
  • 《投资-90》价值投资者的认知升级与交易规则重构 - 第三层:DCF算的未来多少年的现金总和?
  • 网站开发的套路龙腾盛世网站建设
  • .NET周刊【9月第3期 2025-09-21】
  • 建站模板哪里好关于音乐的个人网站
  • 力扣第470场周赛
  • leetcode滑动窗口(C++)
  • 企业网站建设代理公司intitle 网站建设
  • 多模卫星导航定位与应用-原理与实践(RTKLib)6
  • PSP用PS1(PSX)中文游戏合集
  • 吴恩达机器学习课程(PyTorch适配)学习笔记:1.3 特征工程与模型优化
  • golang面经——GC模块
  • 微信小程序中的双线程模型及数据传输优化
  • 网站建设最流行语言电商网站设计岗位主要是
  • 《投资-77》价格投机者如何重构认知与交易准则 - 现成的常见工具