题目.用两个栈实现一个队列。队列的声明如下,请实现它的两个函数appendTail和deleteHead分别完成在对尾插入节点和在队头删除节点。

该队列类模板如下:

 1 template <typename T>
 2 class CQueue
 3 {
 4 public:
 5     void appendTail(const T& node);
 6     T deleteHead()
 7
 8 private:
 9       stack<T> stack1;
 10      stack<T> stack2;
 11 }

首先先说明一些概念:

栈和队列是两种常用的抽象的数据结构。当然可以用数组和链表分别来实现。

1.栈的特点是先进后出,最后进入栈的元素最先出栈,而最先进入栈的元素却被压在栈底,最后才能取出。

2.队列的特点是先进先出,类似于食堂打饭排队一样,先排队的先打饭,后排队的后打饭。

3.这里我们声明了一个函数模板,函数模板其实是一种泛型编程思想,而C++中的STL库大量使用这种思想,比如我们声明一个容器vector,这个vector可以是整型的容器 vector<int> 可以是string类型的容器 vector<string> 然而vector对于不同的数据类型提供了同样的操作,这使得程序的可复用性大大增强。

两个栈实现一个队列的插入和删除功能,步骤如下:

1.设两个栈为stack1和stack2

2.队列尾端插入直接插入在stack1中

3.对于删除队列头部节点,如果stack2不为空,那么直接从stack2顶端取出元素(stack2中的元素为stack1中的元素顺序出栈再顺序插入到栈stack2中)

4.如果stack2为空,那么我们将stack1中的元素顺序出栈再压入stack2中。然后再从stack2中取出元素。

实现如下:

single.h中我们实现这个队列模板类:

 1 #include <stack>
 2 using namespace std;
 3
 4 template <typename T>
 5 class CQueue
 6 {
 7 public:
 8     void appendTail(const T& node);
 9     T deleteHead();
10
11 private:
12     stack<T> stack1;
13     stack<T> stack2;
14 };
15
16 template <typename T> void CQueue<T>::appendTail(const T& node)
17 {
18     stack1.push(node);
19 }
20
21
22 template <typename T> T CQueue<T>::deleteHead()
23 {
24     if(!stack2.empty())
25     {
26         T temp=stack2.top();
27         stack2.pop();
28         return temp;
29     }
30     else
31     {
32         if(stack1.empty())
33         {
34             cout<<"队列元素为空,请先插入元素入队列\n";
35         }
36         else
37         {
38             while(!stack1.empty())
39             {
40                 stack2.push(stack1.top());
41                 stack1.pop();
42             }
43
44             T temp=stack2.top();
45             stack2.pop();
46             return temp;
47         }
48
49     }
50 }

在main.cpp中测试该队列类的插入和删除:

 1 #include "single.h"
 2 #include <iostream>
 3 using namespace std;
 4
 5
 6 int main()
 7 {
 8     CQueue<int> queue;
 9     int data;
10     queue.deleteHead();
11     cout<<"Please input the data you want to append in queue(0-exit):"<<endl;
12     while(true)
13     {
14         cin>>data;
15         if(data!=0)
16         {
17             queue.appendTail(data);
18         }
19         else
20         {
21             break;
22         }
23
24     }
25
26     cout<<"Delete a queue node:"<<queue.deleteHead()<<endl;
27     cout<<"Delete a queue node:"<<queue.deleteHead()<<endl;
28     cout<<"Delete a queue node:"<<queue.deleteHead()<<endl;
29     queue.deleteHead();
30
31     return 0;
32 }

运行截图如下:

我们再队列中依次进入1,2,3 删除时也是按照先进先出的顺序删除节点。当队列无元素时则会提醒我们队列为空。

好了,就到这里吧。是不是明白了呢?

剑指offter-面试题7.用两个栈实现队列相关推荐

  1. 剑指Offe面试题:用两个栈实现队列

    用两个栈实现队列 题目描述 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 分析 首先可以自己尝试使用1 2 3少量元素的入栈出栈摸索两个栈的使用,从特殊到一般 ...

  2. 剑指Offer - 面试题9. 用两个栈实现队列

    1. 题目 用两个栈实现一个队列.队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能.(若队列中没有元素,del ...

  3. 剑指offer面试题[7]-用两个栈实现队列

    题目描述 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 解题思路: 一个队列包含两个栈,这道题目的意图是要求我们操作两个"先进后出"的栈实现 ...

  4. 剑指offer面试题09. 用两个栈实现队列(队列、栈)

    题目描述 用两个栈实现一个队列.队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能.(若队列中没有元素,dele ...

  5. 剑指offer第二版-9.用两个栈实现队列

    描述:使用两个栈实现一个队列.队列中实现尾部插入和头部删除函数. 思路:stack1负责插入,stack2负责弹出,如果stack2为空了,将stack1的元素依次弹出并存放到stack2中,之后对s ...

  6. 【剑指offer-Java版】07用两个栈实现队列

    两个栈实现一个队列:stack_1 stack_2 入队操作:直接入stack_1 出队操作:如果stack_2不为空,那么从其中弹出一个作为出队元素,否则将stack_1元素全部依次压入stack_ ...

  7. 剑指offer(05)用两个栈实现队列

    参考:https://www.cnblogs.com/wanghui9072229/archive/2011/11/22/2259391.html 思路1:始终维护s1作为存储空间,以s2作为临时缓冲 ...

  8. 剑指offer——面试题37:两个链表的第一个公共结点

    剑指offer--面试题37:两个链表的第一个公共结点 20180906整理 Solution1: 时间复杂度为O(n2)O(n2)O(n^2)的垃圾算法 /* struct ListNode {in ...

  9. 剑指offer:面试题09. 用两个栈实现队列

    题目:用两个栈实现队列 用两个栈实现一个队列.队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能.(若队列中没有 ...

  10. [剑指offer]面试题37:两个链表的第一个公共结点

    面试题37:两个链表的第一个公共结点 题目:输入两个链表,找出它们的第一个公共结点.链表结点定义如下: struct ListNode {int val;ListNode *next;ListNode ...

最新文章

  1. “Attention is All You Need 翻译
  2. modal ajax,在Modal中调用Vue.js AJAX
  3. php get_token_all函数,pimcore getObjectByToken函数PHP对象注入漏洞
  4. 计算payload长度c语言,C语言0长度数组(可变数组/柔性数组)详解
  5. jeewx-qywx-api 1.0版发布,微信企业号Java SDK
  6. I²C那点事儿(一)
  7. drupal7 代码生成用户,并自动登录
  8. 还在用上古的 ls 命令管理文件吗,是时候使用终端文件管理神器 lf 了!
  9. paypal php 方式,如何使用PHP向paypal汇款
  10. 多媒体架构---display介绍
  11. It's only too late if you decide it is. Get busy living, or get busy dying(转)
  12. Mathematica三维画图一些技巧
  13. SparkSql-redis:将查询到的结果保存到redis中
  14. 对List的数据进行分组
  15. 黄仁勋没有回应,英伟达没有新品
  16. 大漠为什么不支持win10_大漠插件3.1233 支持WIN10的游戏后台么
  17. 字符串和转义字符的知识和应用
  18. 论文查找路径 查找IEEE、ScienceDirect论文 免费查看的方法
  19. Falcon(二)——架构详解
  20. DHCP:(10)H3C DHCP features DHCP ARP安全控制

热门文章

  1. 计算机领域一般面试是会问到的各类常见算法的Big-O复杂度
  2. html汉子竖着显示,html文字怎么竖排显示
  3. 武钢四中2021高考成绩查询,长虹中学2019高考喜报
  4. 如何邀请媒体记者报道公司新产品发布会的宣传
  5. 软件腐化的七个特征之牢固性和粘滞性(设计模式原则的反面) (《敏捷软件开发》读书总结第二篇)
  6. 现在的你对未来什么规划?
  7. 大数据在城市规划领域的应用思考
  8. 2020年6月电子学会Python等级考试试卷(一级)考题解析
  9. Mysql compact行格式
  10. vue数据更新,页面不更新