剑指offer--用两个栈实现队列

记录《剑指offer》上的算法题。

题目描述如下:

用两个栈实现一个队列,队列的声明如下,请实现它的两个函数appendTaildeleteHead,分别完成在队列尾部插入结点和在队列头部删除结点的功能。

队列的声明如下:

template <typename T>
class CQueue{
public:CQueue(){}~CQueue(){}void appendTail(const T& node);T deleteHead();bool empty(){return (stack1.size() == 0 && stack2.size() == 0);}
private:stack<T> stack1;stack<T> stack2;
};

实现的代码如下:

template<typename T>
void CQueue<T>::appendTail(const T& node){stack1.push(node);
}template <typename T>
T CQueue<T>::deleteHead(){if (stack2.size() <= 0){while (stack1.size() > 0){T& data = stack1.top();stack1.pop();stack2.push(data);}}if (stack2.size() == 0)throw std::exception("queue is empty");T head = stack2.top();stack2.pop();return head;
}

实现的思路是使用stack1来存储插入的数据,而需要删除的时候,先将stack1的元素都压入stack2中,此时得到的stack2的栈顶元素就是最先插入的元素,并且依次删除stack2的元素得到的元素也是按顺序插入队列的元素顺序,也就是删除的时候先弹出stack2的元素,如果它为空,则查看stack1中是否也是空,如果是空,说明队列是空,不是空,则先弹出到stack2中,然后再依次弹出stack2的元素。

相关的一个题目是用两个队列实现一个栈,实现的思路是,压入元素的时候将元素都压入非空的队列,然后在弹出元素的时候,将非空队列的元素都压入另一个空的队列,除了队尾元素,此时队尾元素就是最后压入栈的元素,也是弹出的第一个元素。

实现代码如下:

#ifndef CSTACK_H_
#define CSTACK_H_
#include<queue>
using std::queue;template <typename T>
class CStack{
public:CStack(){}~CStack(){}void append(const T& data);T remove();bool empty(){return q1.empty() && q2.empty();}
private:queue<T> q1;queue<T> q2;
};template<typename T>
void CStack<T>::append(const T& data){// 插入首选非空的队列,当两个队列都空的时候,默认插入队列1if (q1.empty()){q2.push(data);}else{q1.push(data);}
}template<typename T>
T CStack<T>::remove(){// 删除元素的时候,将非空的队列的所有元素,除了队尾元素外,都插入到空的队列中T res;if (q1.empty()){while (q2.size() > 1){T& data = q2.front();q2.pop();q1.push(data);}res = q2.front();q2.pop();}else{while (q1.size() > 1){T& data = q1.front();q1.pop();q2.push(data);}res = q1.front();q1.pop();}return res;
}
#endif

完整的代码例子可以查看我的Github。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/408993.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

剑指offer--旋转数组的最小数字

记录来自《剑指offer》上的算法题。 题目描述如下&#xff1a; 把一个数组最开始的若干个元素搬到数组的末尾&#xff0c;我们称之为数组的旋转。输入一个递增排序的数组的一个选择&#xff0c;输出旋转数组的最小元素。例如数组{3,4,5,1,2}是{1,2,3,4,5}的一个旋转&#xff0…

python 合并excel 自动更新_手把手教你4种方法用Python批量实现多Excel多Sheet合并

一、前言大家好&#xff0c;我是崔艳飞。前两天给大家分享了Python自动化文章&#xff1a;手把手教你利用Python轻松拆分Excel为多个CSV文件&#xff0c;而后在Python进阶交流群里边有读者遇到一个问题&#xff0c;他有很多个Excel表格&#xff0c;他需要对这些Excel文件进行合…

jQuery布局插件UI Layout简介

UI Layout是一种基于jQuery的布局框架&#xff0c;项目主页http://layout.jquery-dev.net/。该框架的参考原型是ExtJS的border-layout&#xff0c;因此十分适用于将原有使用ExtJS的项目改造成jQuery项目。其核心是一个大小自适应的中心面板&#xff08;必选&#xff09;&#x…

淘到了一个不错的TF卡读卡器

最近换手机的时候一时冲动败了个32G的TF卡。买后又觉得手机存储空间还比较充裕&#xff0c;暂时用不上&#xff0c;便打算套个读卡器当U盘用。最开始我用的是以前买手机的时候送的一个读卡器&#xff0c;但其兼容性很差&#xff0c;在以前的那个8G的卡里还能勉强用用&#xff0…

剑指offer--斐波那契数列

记录来自《剑指offer》的算法题。 题目如下&#xff1a; 写一个函数&#xff0c;输入n&#xff0c;实现斐波那契数列的第n项。 斐波那契数列的定义如下&#xff1a; f(n)⎧⎩⎨01f(n−1)f(n−2)n0n1n>1f(n) = \begin{cases} 0 & n=0 \\ 1 & n=1 \\ f(n-1) + f(n-2…

java jdbc6_Java学习-JDBC

JDBC1、数据库驱动应用程序通过驱动连接到数据库&#xff0c;进而操作数据库。2、JDBC简化开发人员对数据库的操作&#xff0c;提供了一个java操作数据库的规范&#xff0c;俗称JDBC对于程序猿&#xff0c;只需要学习JDBC提供的接口。java.sqljavax.sqlpublic class DemoJdbc01…

Unity3D For Android 开发教程【转http://game.ceeger.com/Unity/Doc/2011/Unity3D_For_Android.html】...

Unity3D For Android 开发教程 Date:2011-08-01 04:33我自认为抵挡诱惑的能力还是很强大的&#xff0c;关键的时候还能把持住自己。今天逛了一下南京的丹凤街&#xff0c;终于受不住Android这美眉的诱惑。她虽脸蛋不怎么滴&#xff0c;但身材火热&#xff0c;且性感&#xff0c…

剑指offer--二进制中1的个数

记录来自《剑指offer》上的算法题。 题目如下&#xff1a; 请实现一个函数&#xff0c;输入一个整数&#xff0c;输出该数二进制表示中1的个数。例如把9表示成二进制是1001&#xff0c;有两位是1&#xff0c;因此如果输入9&#xff0c;函数输出是2。 这道题目的一个基本思路是…

CentOS 6.4 编译安装 gcc-4.8.0

1.首先下载源代码 wget http://ftp.gnu.org/gnu/gcc/gcc-4.8.0/gcc-4.8.0.tar.bz22.解压 tar -jxvf gcc-4.8.0.tar.bz23.下载编译所需的依赖项 cd gcc-4.8.0  ./contrib/download_prerequisites  cd ..4.建立编译输出目录 mkdir gcc-build-4.8.05.进入此目录&#xff0c;执…

剑指offer--数值的整数次方

记录来自《剑指offer》上的算法题。 题目描述&#xff1a; 实现函数 double Power(double base, int exponent), 求 base的 exponent次方。不得使用库函数&#xff0c;同时不需要考虑大数问题。 下面是一种解法&#xff1a; // 判断num1是否等于num2 bool equal(double num1,…

jackson java网络接口_java~jackson实现接口的反序列化

jackson是springboot中集成的序列化方式&#xff0c;是默认的json序列化方式&#xff0c;当然你可以使用其它的序列化工具代替它&#xff0c;不过今天我们还是说一下它&#xff0c;使用jackson进行序列化一个类&#xff0c;然后再把它的JSON字符反序列化为它的接口对象。现实这…

剑指offer--打印1到最大的n位数

记录来自《剑指offer》上的算法题。 题目如下&#xff1a; 输入数字n&#xff0c;按顺序打印出从1到最大的n位十进制数。比如输入3&#xff0c;则打印出1&#xff0c;2&#xff0c;3一直到最大的3位数即999。 第一种解法是比较容易想到&#xff0c;但是遇到大数问题的时候会有…

java判断闰年通过多态方法_04748《Java语言程序设计》实验指导书.doc

04748《Java语言程序设计》实验指导书.docJava语言程序设计实验指导书前言一、上机实验目的上机实验的目的是提高学生的分析问题、解决问题的能力和动手能力&#xff0c;通过实践环节理解 Java语言的基本结构和程序设计方法。通过亲手编程掌握 Java 程序设计编程的方法。二、实…