news 2026/5/25 16:28:47

用栈实现队列

作者头像

张小明

前端开发工程师

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/5/25 7:46:18

好写作AI算法揭秘:如何让AI写出“有学术味儿”的文章?

当你担心AI生成的论文像“学术界的机器人发言稿”时&#xff0c;好写作AI正在底层算法里悄悄植入学术DNA。如果让一个通用大语言模型写学术论文&#xff0c;结果可能像用百度翻译莎士比亚——意思大概对&#xff0c;但“内味儿”全无。据统计&#xff0c;未经专门调优的AI在学术…

作者头像 李华
网站建设 2026/5/26 6:15:31

IDEA插件下载慢?2步提速起飞

最近更新了IDEA为最新版&#xff0c;虽然保存了&#xff0c;但还是一部分插件失效了&#xff0c;需要重新下载&#xff0c;下载插件时不是安装慢就是超时&#xff0c;总之就是安装不上&#xff0c;还是记录一下&#xff0c;说不定以后哪天还能用到&#xff0c; 1.查找 国内插件…

作者头像 李华
网站建设 2026/5/26 6:15:43

学Simulink——移动机器人基础驱动场景实例:基于Simulink的PMSM轮毂电机 id​=0 矢量控制(FOC)入门仿真

目录 手把手教你学Simulink——移动机器人基础驱动场景实例:基于Simulink的PMSM轮毂电机 id​=0 矢量控制(FOC)入门仿真 一、引言:为什么移动机器人要用 FOC?——从“能转”到“精准控转矩” 二、FOC 原理简述:让交流电机像直流电机一样控制 FOC 控制流程(五步法):…

作者头像 李华
网站建设 2026/5/26 6:15:28

基于Simulink的PMSM轮毂电机Pure Pursuit路径跟踪控制仿真

目录 手把手教你学Simulink——移动机器人导航场景实例:基于Simulink的PMSM轮毂电机Pure Pursuit路径跟踪控制仿真 一、引言:从“能走”到“走准”——路径跟踪是自主导航的核心 二、系统架构总览 三、Pure Pursuit 算法原理(简明版) 四、应用场景:差速驱动AGV路径跟踪…

作者头像 李华