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

用栈实现队列

前言

今天我的任务是首先利用一个小时完成用栈实现队列以及用队列实现栈的代码整理,并保证能够独立写出来,然后利用半小时的时间,完成串的概念以及代码的学习,然后去健身一个小时到一个半小时,然后利用半小时吃个饭,然后晚上七点半回来做牛客周赛,比赛结束后,利用一个小时学习概数。

代码

#include<iostream> #include<stdexcept> using namespace std; template<typename T> class Stack { private: T* data; int size; int capacity; void resize(); public: Stack() :data(new T[10]), size(0), capacity(10){} ~Stack(); void push(T x); T pop(); T top() const;//必须加const int getSize() const;//必须加const bool empty() const;//添加判断是否为空的接口 }; template<typename T> void Stack<T>::resize() { T* newData = new T[capacity * 2]; for (int i = 0; i < size; i++) { newData[i] = data[i]; } delete[] data; data = newData; capacity *= 2; } template<typename T> Stack<T>::~Stack() { delete[] data; } template<typename T> void Stack<T>::push(T x) { if (size == capacity) { resize(); } data[size++] = x; } template<typename T> T Stack<T>::pop() { if (size == 0) { throw underflow_error("Stack is empty!"); } return data[--size]; } template<typename T> T Stack<T>::top() const{ if (size == 0) { throw underflow_error("Stack is empty!"); } return data[size - 1]; } template<typename T> int Stack<T>::getSize() const{ return size; } template<typename T> bool Stack<T>::empty() const { return size == 0; } //template<typename T>不用写这个 class Queue { private: Stack<int> s1;//直接大小于号套数据类型 Stack<int> s2;//辅助栈 public: Queue(){} void push(int x) {//这里为什么不先声明然后再实现函数呢 s1.push(x); } int pop() {//这个接口的实现逻辑有点看不懂 if (s2.empty()) { while (s1.getSize()) { s2.push(s1.pop()); } } return s2.pop(); } int peek() {//返回队首元素 if (s2.empty()) { while (s1.getSize()) { s2.push(s1.pop()); } } return s2.top(); } bool empty() { /*if (s1.empty() && s2.empty()) { return true; } else { return false; }*/ return s1.empty() && s2.empty(); } }; int main() { Queue q; q.push(1); q.push(2); q.push(3); q.push(4); cout << q.pop(); return 0; }

解释

按照以往的传统,我们依然采用逐字逐句去剖析的方法,

首先是栈部分代码的实现,这里我们首先是利用顺序表来实现这个栈,这部分的代码我们之前已经讲过啦,请看这个顺序表实现栈:具体函数实现​​​​​​,然后这里主要说一下相比以前添加的部分,这是判断栈为空的函数,后续需要配合实现队列的过程使用。

template<typename T> bool Stack<T>::empty() const { return size == 0; }

然后就是队列的类的实现啦,前面栈的类的实现部分使用了这一行语句template<typename T>,这里使用模板将Stack类作为通用型栈容器,可以支持任何的数据类型,而下面这个队列被设计为存储int类型的队列,所以不需要模板的声明,其中作为成员变量的两个栈,数据类型也是用通用栈的类名加上对应的数据类型来使用的。

//template<typename T>不用写这个 class Queue { private: Stack<int> s1;//直接大小于号套数据类型 Stack<int> s2;//辅助栈

还有后面的具体函数实现部分,与前面栈的类的实现不同,队列这里的函数是直接在类内实现的,而前面通用型栈的类的实现中,函数都是在类外进行实现的,其实两者实现方式都是可以的,只不过模板类的要加上全模板声明(比如template<typename T> void Stack<T>::push(T x))。

还有就是,在队列的类的实现中,构造函数中没有任何内容,这是因为实现队列的两个栈已经在栈的类中完成了初始化,所以说在队列中就不需要啦。

public: Queue(){} void push(int x) {//这里为什么不先声明然后再实现函数呢 s1.push(x); } int pop() {//这个接口的实现逻辑有点看不懂 if (s2.empty()) { while (s1.getSize()) { s2.push(s1.pop()); } } return s2.pop(); } int peek() {//返回队首元素 if (s2.empty()) { while (s1.getSize()) { s2.push(s1.pop()); } } return s2.top(); } bool empty() { /*if (s1.empty() && s2.empty()) { return true; } else { return false; }*/ return s1.empty() && s2.empty(); } };

反思

对于获取长度,获取栈顶元素,判断是否为空等函数,不要忘记添加const关键字

http://www.cnnetsun.cn/news/51565.html

相关文章:

  • 解放双手!钉钉智能打卡神器完全上手手册
  • DMXAPI全球模型API调用完全指南:从入门到精通
  • 告别“翻墙“烦恼:DMXAPI让Gemini-3-pro-thinking调用快如闪电
  • leetcode 744. Find Smallest Letter Greater Than Target 寻找比目标字母大的最小字母-耗时100%
  • Home Assistant通知系统:3步打造智能家居提醒中心
  • 学Simulink——机器人轨迹跟踪场景实例:基于Simulink的永磁同步电机笛卡尔空间圆弧轨迹跟踪仿真
  • 【毕业设计/课程设计】基于Java的高校学科竞赛平台的设计与实现/源码+论文+PPT+数据
  • java计算机毕业设计摄影爱好者交流平台 基于SpringBoot的影像作品分享与互动社区 摄影圈层社交与作品点评一体化平台
  • “AI 写的论文,参考文献靠谱吗?”—— 虎贲等考 AI 给出答案:所有参考文献均来自知网、维普,全程可查、合规可溯
  • 2025年AI降重工具深度评测:10款零风险智能改写方案(askpaper与aibiiye实测)
  • java计算机毕业设计社团管理系统 高校学生社团数字化运营平台 校园社团协同管理与活动发布系统
  • 缩短启动时间的定制支持成为采用关键——持续选用Silex希来科无线模块逾十年~
  • NAT技术和链路层概述
  • 数据库约束
  • Blender主题定制终极指南:如何快速打造个性化界面
  • 【无标题】web第三周
  • Holo1.5开源:小模型颠覆UI智能交互,企业级AI代理成本骤降80%
  • 如何快速掌握umy-ui:面向Vue开发者的终极性能优化指南
  • 【流程】——若依项目前后端打包发布到服务器
  • Velero压缩引擎深度解析:从架构原理到实战调优
  • DolphinScheduler 2025技术生态:从零开始掌握分布式调度系统
  • 5大WebGPU错误终极解决方案:让WebLLM硬件加速不再失败
  • 一步成图革命:OpenAI一致性模型如何重塑2025生成式AI生态
  • GDevelop游戏引擎终极指南:从零基础到专业开发全流程
  • 生成对抗网络创建测试数据
  • java计算机毕业设计社区医疗服务管理系统 街区智慧健康服务管理平台 基层医疗信息综合管理系统
  • S7-1500TF + S210 绝对齿轮同步:双轴梯形图程序解析
  • 中望CAD2026:消除图纸中的重线
  • Docker实战:创建和使用Docker私有仓库
  • K8S-EFK日志收集实战指南