news 2026/4/23 9:44:27

用栈实现队列

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
用栈实现队列

前言

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

代码

#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关键字

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/23 9:44:23

vxe-table表格组件的终极使用指南:从入门到精通

还在为Vue项目中的复杂表格需求头疼吗&#xff1f;vxe-table表格组件可能是你的完美解决方案&#xff01;作为一名资深Vue开发者&#xff0c;我亲身体验了vxe-table的强大功能&#xff0c;现在将这份终极使用指南分享给你&#xff0c;帮助你快速掌握这个优秀的表格组件。 【免费…

作者头像 李华
网站建设 2026/4/23 9:44:25

智能代码审查中的测试关联技术:原理、应用与未来展望

在当今快节奏的软件开发周期中&#xff0c;代码审查作为保障代码质量的关键环节&#xff0c;正逐步与人工智能技术深度融合。智能代码审查通过自动化分析代码变更&#xff0c;识别潜在缺陷、安全漏洞和性能瓶颈&#xff0c;而测试关联技术则进一步将审查结果与测试活动无缝衔接…

作者头像 李华
网站建设 2026/4/9 21:53:48

创建一个大BOSS!(4)准备招式1,武器!飞!

我们先做一个召唤出来的武器&#xff0c;这里就随便做一个代替一下。随便选个长条的形状调整一下大概这样再加个箭头组件再给Staticmesh加一个碰撞体调整一下再添加一个发射物移动组件设置这个参数再给他加一个时间轴&#xff0c;来到事件图表自动播放提升完变量后改个名来到构…

作者头像 李华
网站建设 2026/4/17 15:17:17

性能优化实战:Open-SaaS异步邮件系统的架构重构与实现

性能优化实战&#xff1a;Open-SaaS异步邮件系统的架构重构与实现 【免费下载链接】open-saas A free, open-source SaaS app starter for React & Node.js with superpowers. Production-ready. Community-driven. 项目地址: https://gitcode.com/GitHub_Trending/op/op…

作者头像 李华
网站建设 2026/4/20 1:38:03

计算机毕业设计springboot新星排球俱乐部运营系统 SpringBoot 驱动的“燃动排球俱乐部”综合运营平台 基于 SpringBoot 的“飞悦排球联盟”智慧管理与营销系统

计算机毕业设计springboot新星排球俱乐部运营系统0rzk0q2a &#xff08;配套有源码 程序 mysql数据库 论文&#xff09; 本套源码可以在文本联xi,先看具体系统功能演示视频领取&#xff0c;可分享源码参考。当“双减”与全民健身把青少年推向球场&#xff0c;当碎片化时间倒逼俱…

作者头像 李华