剑指offer之两个队列实现栈的问题
1 问题
两个队列实现栈的插入和获取头部元素的功能
2 分析
1)获取头部元素的功能分析:
我们有2个队列,我们知道队列的特点的先进先出,而栈的特点是先进后出,比如我们有数据1,2,3,4,我们分别依次压入队列1,队列2目前是空,我们需要有栈的效果,加上队列2也是先进先出的特点,意味着我们队列2里面的数据依次是4,3,2,1入队列2,现在问题转成了我们怎么操作队列1里面的数据让它依次弹出4,3,2,1入队列2
接下来我们分析怎么操作队列1里面的数据让它依次弹出4,3,2,1入队列2
我们知道队列1数据进去的时候是1,2,3,4.我们需要得到4,我们可front()得到进入队列的第一个元素,然后push到队列1,然后执行pop()函数,那么队列1就变成了2,3,4,1, 同理我们也这样操作,知道元素4在队列的最头部,队列1也就变成了3,2,1,4,我们把4弹出来压入到队列2里面去,然后队列1的数据是3,2,1,我们依然按照上面的方法,把3弹出来压入队列2,最后队列2就入队列的元素依次是4,3,2,1 再把队列2弹出头部元素,就是我们栈获取头部元素的效果。
2)插入元素的功能分析:
如果队列2不为空的情况下,我们需要先把队列2里面的元素一一弹出来放到(push)队列1里面去,确保队列2是空的之后,然后再把新的元素push到队列的1的尾巴
如果队列2为空的情况下,我们可以直接把新的元素push到队列1里面去就行。
3 代码实现
#include <iostream>
#include <queue>using namespace std;class student
{
public:student(){}~student(){}student(std::string name, std::string age, std::string sex) {this->name = name;this->age = age;this->sex = sex;}void toString(){std::cout << "name is "<< name << " age is "<< age << " sex is "<< sex << std::endl;}
private:std::string name;std::string age;std::string sex;
};template <typename T>
class Test
{
public:Test(){}~Test(){}Test(const T& t);//往队列里面添加元素void add(const T& t);//往队列里面删除元素T top();
private:std::queue<T> queue1;std::queue<T> queue2;
};template <typename T> void Test<T>::add(const T& t)
{if (!queue2.empty()){T& top = queue2.front();queue1.push(top);queue2.pop();}queue1.push(t);
}template <typename T> T Test<T>::top()
{if (queue2.empty()){while (!queue1.empty()){int size = queue1.size();for (int i = 1; i < size; ++i){T& top = queue1.front();queue1.push(top);queue1.pop();}T& value = queue1.front();queue2.push(value);queue1.pop();}}T top = queue2.front();queue2.pop();return top;
}
int main() {student std1("chenyu", "27", "man");student std2("chencaifeng", "27", "woman");student std3("chenzixuan", "3", "woman");student std4("chenzixi", "2", "woman");student std5("chenxuan", "21", "man");Test<student> stack;stack.add(std1);stack.add(std2);stack.add(std3);stack.add(std4);student top1 = stack.top();top1.toString();student top2 = stack.top();top2.toString(); student top3 = stack.top();top3.toString(); std::cout << "--------------------" << std::endl; stack.add(std5);student top4 = stack.top();top4.toString(); student top5 = stack.top();top5.toString(); return 0;
}
4 运行结果
name is chenzixi age is 2 sex is woman
name is chenzixuan age is 3 sex is woman
name is chencaifeng age is 27 sex is woman
--------------------
name is chenxuan age is 21 sex is man
name is chenyu age is 27 sex is man
如果我分析的有点问题或者哪里没有考虑到,欢迎大家指出来。
最后附加:
我的微信:
打赏博主 非常感谢:
剑指offer之两个队列实现栈的问题相关推荐
- 【LeetCode】剑指 Offer 52. 两个链表的第一个公共节点
[LeetCode]剑指 Offer 52. 两个链表的第一个公共节点 文章目录 [LeetCode]剑指 Offer 52. 两个链表的第一个公共节点 一.双指针 一.双指针 设 "第一个 ...
- 剑指 Offer 52. 两个链表的第一个公共节点
题目:剑指 Offer 52. 两个链表的第一个公共节点 ,哈哈,我们今天来看一道很简单的题嘛,这是选自剑指 Offer 上的一道题,好了,我们一起来看看题意吧: 考虑到直接复制题目,或者截屏的方式不 ...
- 《LeetCode力扣练习》剑指 Offer 30. 包含min函数的栈 Java
<LeetCode力扣练习>剑指 Offer 30. 包含min函数的栈 Java 一.资源 题目: 定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调 ...
- 【LeetCode】剑指 Offer 30. 包含min函数的栈
[LeetCode]剑指 Offer 30. 包含min函数的栈 文章目录 [LeetCode]剑指 Offer 30. 包含min函数的栈 一.辅助栈 一.辅助栈 解题思路: 普通栈的 push() ...
- 剑指 Offer 30. 包含min函数的栈 (python实现)
剑指 Offer 30. 包含min函数的栈 定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min.push 及 pop 的时间复杂度都是 O(1). 示例 ...
- Python描述 LeetCode 剑指 Offer 30. 包含min函数的栈
Python描述 LeetCode 剑指 Offer 30. 包含min函数的栈 大家好,我是亓官劼(qí guān jié ),在[亓官劼]公众号.CSDN.GitHub.B站等平台分享一些技术 ...
- 剑指offer:包含min函数的栈 python实现
题目 题目描述 定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1)). 解题思路 暴力做法: 遍历一遍,找最小的数,然后返回. # -*- coding ...
- 【简洁写法】剑指 Offer 30. 包含min函数的栈
立志用最少的代码做最高效的表达 定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min.push 及 pop 的时间复杂度都是 O(1). 示例: MinSt ...
- [剑指offer] 用两个栈实现队列
本文首发于我的个人博客:尾尾部落 题目描述 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 解题思路 两个栈 stack1 和 stack2: push 动作都在 ...
最新文章
- 关于php socket客户端连接java socket服务器端,出现连接中断的问题。
- Go中的Map实现机制
- 你不能准时下班的根本原因是……
- 轻松理解spring IOC
- android 防腾讯新闻标题栏,仿腾讯视频android客户端上方的标题栏
- SDN基本概念和Overlay技术
- android selector 开始自定义样式
- 【VS2010学习笔记】【异常处理】general error c1010070: Failed to load and parse the manifest.
- 基于RV1126平台imx291分析 --- imx291注册
- 什么是智能门锁,智能门锁主要有哪些优点?
- 【机器人学习】六自由度机械臂动力学分析(扭矩计算)
- 香港房地产业发展历程、现状、问题及对策探究
- 旁路和去耦电容 bypass decouple
- 网页如何更改为黑白效果
- 几种 Proximity Graphs 的单调性分析
- 出生日期与年龄python_python根据出生日期返回年龄的方法
- 神州数码交换机CS6200命令(一)
- Flappy bird模式值得追捧么?
- mysql 同步失败_mysql 同步失败解决方法 (错误:1236)
- Solidworks提示字体Arial Unicode MS安装不正确,PDF文件中一个或多个文本字串可能遗失怎么办...
热门文章
- 如何通过提问成为更好的开发人员
- String是一个奇怪的引用类型
- 如何在 ASP.NET Core 中使用 HttpClientFactory ?
- BeetleX之Websocket服务使用
- 大改革,GNOME 3.x将直接跳到GNOME 40
- 不仅性能秒杀Hadoop,现在连分布式集群功能也开源了
- 如何查找,修复和避免C#.NET中内存泄漏的8个最佳实践
- Kubernetes 与 Helm:使用同一个 Chart 部署多个应用
- 2019 年 8 月编程语言排行榜,C#重回增长之路
- 通过Blazor使用C#开发SPA单页面应用程序(1)