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

C++ stack 容器适配器-栈

stack 容器适配器

#include<iostream>#include<stack>#include<vector>#include<deque>/* stack 容器适配器 stack 本身不是一种容器,是基于容器是实现的 所有操作都在栈顶进行 top stack 本身没有迭代器 */// 使用函数模板template<typenameT>voiddisplay(std::stack<T>s){while(!s.empty())// 不为空 则执行{T elem=s.top();//读取栈顶元素std::cout<<elem<<" ";s.pop();// 弹出栈顶元素}std::cout<<std::endl;};intmain(){std::stack<int>s;for(autoi:{1,2,3,4,5})s.push(i);// 放入栈中display(s);s.push(100);// 压入元素display(s);s.pop();s.pop();display(s);// 没有清空的方法,只有一个一个弹出while(!s.empty())s.pop();display(s);s.push(10);s.push(11);s.top()=100;display(s);}

函数 功能
push(val) 向栈顶插入元素 val
pop() 删除栈顶元素(无返回值)
top() 返回栈顶元素的引用(可修改)
empty() 判断栈是否为空(空返回 true)
size() 返回栈中元素的个数

#include<iostream>usingnamespacestd;// 进阶版栈:动态扩容 + 安全检查 + 简单封装classAdvancedStack{private:int*arr;// 动态数组(替代固定数组,支持扩容)inttop;// 栈顶标记(-1=空栈)intcapacity;// 当前数组容量(初始为4)// 私有辅助函数:扩容(容量翻倍)voidexpand(){// 1. 新容量 = 原容量 * 2intnew_cap=capacity*2;// 2. 分配新数组int*new_arr=newint[new_cap];// 3. 拷贝旧数据到新数组for(inti=0;i<capacity;i++){new_arr[i]=arr[i];}// 4. 释放旧数组,更新指针和容量delete[]arr;arr=new_arr;capacity=new_cap;cout<<"栈扩容啦!新容量:"<<capacity<<endl;}public:// 构造函数:初始化空栈(初始容量4)AdvancedStack(){capacity=4;arr=newint[capacity];// 动态分配初始数组top=-1;}// 析构函数:释放动态数组(避免内存泄漏)~AdvancedStack(){delete[]arr;}// 1. 入栈(自动扩容)voidpush(intval){// 检查是否满了:栈顶 == 容量-1 时扩容if(top==capacity-1){expand();}top++;arr[top]=val;cout<<"入栈:"<<val<<",当前栈顶:"<<arr[top]<<endl;}// 2. 出栈(安全检查)voidpop(){if(top==-1){cout<<"错误:栈空,无法出栈!"<<endl;return;}cout<<"出栈:"<<arr[top]<<endl;top--;}// 3. 获取栈顶(安全检查)intgetTop(){if(top==-1){cout<<"错误:栈空,无栈顶元素!"<<endl;return-1;// 返回无效值}returnarr[top];}// 4. 判空boolisEmpty(){returntop==-1;}// 5. 获取当前元素个数intsize(){returntop+1;}};// 测试代码intmain(){// 极简版// // 1. 定义栈的核心:数组(存数据)+ top(标记栈顶)// int stack_arr[5]; // 最多存5个元素,够教学用// int top = -1; // top=-1 表示空栈// // 2. 入栈操作(压栈):往栈顶加元素// top++; // 栈顶标记后移// stack_arr[top] = 10; // 存第一个元素10// top++;// stack_arr[top] = 20; // 存第二个元素20// top++;// stack_arr[top] = 30; // 存第三个元素30// cout << "当前栈顶:" << stack_arr[top] << endl; // 输出30(最后存的)// // 3. 出栈操作(弹栈):删除栈顶元素// top--; // 栈顶标记前移,相当于删掉30// cout << "出栈后栈顶:" << stack_arr[top] << endl; // 输出20// // 4. 再出栈一次// top--;// cout << "再出栈后栈顶:" << stack_arr[top] << endl; // 输出10// // 5. 出栈到空// top--;// if (top == -1) {// cout << "栈空了!" << endl;// }AdvancedStack stack;// 1. 入栈5个元素(触发扩容:初始容量4,第5个元素扩容到8)stack.push(10);stack.push(20);stack.push(30);stack.push(40);stack.push(50);// 这里会触发扩容// 2. 访问栈顶和大小cout<<"当前栈大小:"<<stack.size()<<endl;cout<<"当前栈顶:"<<stack.getTop()<<endl;// 3. 出栈测试stack.pop();stack.pop();cout<<"出栈两次后栈顶:"<<stack.getTop()<<endl;// 4. 出栈到空,测试安全检查stack.pop();stack.pop();stack.pop();stack.pop();// 栈空,触发错误提示return0;}
http://www.jsqmd.com/news/507452/

相关文章:

  • FPGA动态部分重配置技术的三大实现方案对比
  • Rancher容器网络深度剖析:从基础概念到高级配置
  • 别再傻傻分不清了!从摄像头RAW到屏幕RGB,图像格式转换保姆级指南
  • 大小端的计算公式
  • Linux网络编程:TCP初体验
  • Qt 线程
  • CosyVoice 实战部署全攻略:从云端实例到本地服务,5步打造专属语音克隆应用
  • python中class与C++class的区别和联系
  • 终极指南:MS-DOS批处理变量使用与早期脚本参数传递技巧
  • 基频检测算法总结
  • Zig核心特性深度解析:为何它能替代C成为系统编程新宠
  • 如何轻松实现微信聊天记录从JSON到PDF的完整转换:GitHub_Trending/we/WeChatMsg终极指南
  • 深入解析Python的glob.glob()函数:高效递归匹配文件与目录的实战技巧
  • 海康威视DS-2CD2T2HY-LP1刷机固件包|含专用刷机工具+通用版固件|支持强刷救砖|终身可重复使用
  • Navicat Premium连接Oracle 11g保姆级教程(附instantclient配置避坑指南)
  • BackInTime 开源项目安装与使用指南
  • UR5机械臂实战:不依赖MoveIt的直接ROS控制方法(Python示例)
  • 100套前端可视化模板合集:支持HTML与Vue双架构,集成高德地图+百度ECharts图表
  • TF-IDF vs Word2Vec:如何根据你的项目需求选择合适的文本表示方法?
  • 探秘UI宝盒:18个顶级UI片段让你的前端开发效率提升300%
  • Discord 图片日志记录器使用教程
  • Dioxus国际化方案:构建多语言支持的全球应用
  • Postgres与Mybatis高效批量操作实战:从基础到高级冲突处理
  • 为什么老项目必须升级Apache Commons Collections?从CC1链看第三方库的安全风险
  • RAG分块策略实战:5种方法代码对比与性能测试(含GPT-4分块技巧)
  • 从克尔效应到频谱展宽:用Lumerical INTERCONNECT可视化SPM全流程
  • PVE 2.5G网卡性能优化:从通用驱动r8169到专用驱动r8125的实战迁移
  • H3C三层链路聚合实战:路由场景下的高可用配置与故障恢复
  • HarmonyOS 6实战:简单列表折叠和展开
  • 终极Lorri教程:如何简化Nix Shell管理并提升开发效率