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之两个队列实现栈的问题相关推荐

  1. 【LeetCode】剑指 Offer 52. 两个链表的第一个公共节点

    [LeetCode]剑指 Offer 52. 两个链表的第一个公共节点 文章目录 [LeetCode]剑指 Offer 52. 两个链表的第一个公共节点 一.双指针 一.双指针 设 "第一个 ...

  2. 剑指 Offer 52. 两个链表的第一个公共节点

    题目:剑指 Offer 52. 两个链表的第一个公共节点 ,哈哈,我们今天来看一道很简单的题嘛,这是选自剑指 Offer 上的一道题,好了,我们一起来看看题意吧: 考虑到直接复制题目,或者截屏的方式不 ...

  3. 《LeetCode力扣练习》剑指 Offer 30. 包含min函数的栈 Java

    <LeetCode力扣练习>剑指 Offer 30. 包含min函数的栈 Java 一.资源 题目: 定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调 ...

  4. 【LeetCode】剑指 Offer 30. 包含min函数的栈

    [LeetCode]剑指 Offer 30. 包含min函数的栈 文章目录 [LeetCode]剑指 Offer 30. 包含min函数的栈 一.辅助栈 一.辅助栈 解题思路: 普通栈的 push() ...

  5. 剑指 Offer 30. 包含min函数的栈 (python实现)

    剑指 Offer 30. 包含min函数的栈 定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min.push 及 pop 的时间复杂度都是 O(1). 示例 ...

  6. Python描述 LeetCode 剑指 Offer 30. 包含min函数的栈

    Python描述 LeetCode 剑指 Offer 30. 包含min函数的栈   大家好,我是亓官劼(qí guān jié ),在[亓官劼]公众号.CSDN.GitHub.B站等平台分享一些技术 ...

  7. 剑指offer:包含min函数的栈 python实现

    题目 题目描述 定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1)). 解题思路 暴力做法: 遍历一遍,找最小的数,然后返回. # -*- coding ...

  8. 【简洁写法】剑指 Offer 30. 包含min函数的栈

    立志用最少的代码做最高效的表达 定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min.push 及 pop 的时间复杂度都是 O(1). 示例: MinSt ...

  9. [剑指offer] 用两个栈实现队列

    本文首发于我的个人博客:尾尾部落 题目描述 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 解题思路 两个栈 stack1 和 stack2: push 动作都在 ...

最新文章

  1. 关于php socket客户端连接java socket服务器端,出现连接中断的问题。
  2. Go中的Map实现机制
  3. 你不能准时下班的根本原因是……
  4. 轻松理解spring IOC
  5. android 防腾讯新闻标题栏,仿腾讯视频android客户端上方的标题栏
  6. SDN基本概念和Overlay技术
  7. android selector 开始自定义样式
  8. 【VS2010学习笔记】【异常处理】general error c1010070: Failed to load and parse the manifest.
  9. 基于RV1126平台imx291分析 --- imx291注册
  10. 什么是智能门锁,智能门锁主要有哪些优点?
  11. 【机器人学习】六自由度机械臂动力学分析(扭矩计算)
  12. 香港房地产业发展历程、现状、问题及对策探究
  13. 旁路和去耦电容 bypass decouple
  14. 网页如何更改为黑白效果
  15. 几种 Proximity Graphs 的单调性分析
  16. 出生日期与年龄python_python根据出生日期返回年龄的方法
  17. 神州数码交换机CS6200命令(一)
  18. Flappy bird模式值得追捧么?
  19. mysql 同步失败_mysql 同步失败解决方法 (错误:1236)
  20. Solidworks提示字体Arial Unicode MS安装不正确,PDF文件中一个或多个文本字串可能遗失怎么办...

热门文章

  1. 如何通过提问成为更好的开发人员
  2. String是一个奇怪的引用类型
  3. 如何在 ASP.NET Core 中使用 HttpClientFactory ?
  4. BeetleX之Websocket服务使用
  5. 大改革,GNOME 3.x将直接跳到GNOME 40
  6. 不仅性能秒杀Hadoop,现在连分布式集群功能也开源了
  7. 如何查找,修复和避免C#.NET中内存泄漏的8个最佳实践
  8. Kubernetes 与 Helm:使用同一个 Chart 部署多个应用
  9. 2019 年 8 月编程语言排行榜,C#重回增长之路
  10. 通过Blazor使用C#开发SPA单页面应用程序(1)