news 2026/6/23 16:20:40

用栈实现队列

作者头像

张小明

前端开发工程师

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/6/23 11:29:57

解放双手!钉钉智能打卡神器完全上手手册

解放双手&#xff01;钉钉智能打卡神器完全上手手册 【免费下载链接】AutoDingding 钉钉自动打卡 项目地址: https://gitcode.com/gh_mirrors/au/AutoDingding 还在为每天重复的打卡操作而烦恼吗&#xff1f;钉钉智能打卡项目为您提供了一站式的自动化解决方案。这个基于…

作者头像 李华
网站建设 2026/6/23 16:51:54

DMXAPI全球模型API调用完全指南:从入门到精通

欢迎来到小灰灰的博客空间&#xff01;Weclome you&#xff01; 博客主页&#xff1a;IT小灰灰 爱发电&#xff1a;小灰灰的爱发电 热爱领域&#xff1a;前端&#xff08;HTML&#xff09;、后端&#xff08;PHP&#xff09;、人工智能、云服务 目录 一、DMXAPI平台概述&#…

作者头像 李华
网站建设 2026/6/22 19:30:27

告别“翻墙“烦恼:DMXAPI让Gemini-3-pro-thinking调用快如闪电

欢迎来到小灰灰的博客空间&#xff01;Weclome you&#xff01; 博客主页&#xff1a;IT小灰灰 爱发电&#xff1a;小灰灰的爱发电 热爱领域&#xff1a;前端&#xff08;HTML&#xff09;、后端&#xff08;PHP&#xff09;、人工智能、云服务 目录 一、官方调用的四大"…

作者头像 李华
网站建设 2026/6/23 6:39:11

Home Assistant通知系统:3步打造智能家居提醒中心

还在为错过智能家居的重要状态而烦恼吗&#xff1f;Home Assistant通知系统能让你的设备"开口说话"&#xff0c;及时传递关键信息。通过本文的实用指南&#xff0c;即使是新手也能快速掌握通知配置技巧&#xff0c;让智能家居真正智能化&#xff01; 【免费下载链接】…

作者头像 李华