题目.用两个栈实现一个队列。队列的声明如下,请实现它的两个函数appendTail和deleteHead

分别完成在对尾插入节点和在队头删除节点。

该队列类模板如下:

 template <typename T>
class CQueue
{
public:
void appendTail(const T& node);
T deleteHead() private:
stack<T> stack1;
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中我们实现这个队列模板类:

 #include <stack>
using namespace std; template <typename T>
class CQueue
{
public:
void appendTail(const T& node);
T deleteHead(); 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.empty())
{
T temp=stack2.top();
stack2.pop();
return temp;
}
else
{
if(stack1.empty())
{
cout<<"队列元素为空,请先插入元素入队列\n";
}
else
{
while(!stack1.empty())
{
stack2.push(stack1.top());
stack1.pop();
} T temp=stack2.top();
stack2.pop();
return temp;
} }
}

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

 #include "single.h"
#include <iostream>
using namespace std; int main()
{
CQueue<int> queue;
int data;
queue.deleteHead();
cout<<"Please input the data you want to append in queue(0-exit):"<<endl;
while(true)
{
cin>>data;
if(data!=)
{
queue.appendTail(data);
}
else
{
break;
} } cout<<"Delete a queue node:"<<queue.deleteHead()<<endl;
cout<<"Delete a queue node:"<<queue.deleteHead()<<endl;
cout<<"Delete a queue node:"<<queue.deleteHead()<<endl;
queue.deleteHead(); return ;
}

运行截图如下

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

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

剑指offter-面试题7.用两个栈实现队列的更多相关文章

  1. 剑指Offer-【面试题07:两个栈实现队列】

    package com.cxz.question7; import java.util.Stack; /** * 用两个栈实现一个队列.队列的声明如下,请实现它的两个函数appendTail 和del ...

  2. 剑指Offer:面试题7——用两个栈实现队列(java实现)

    题目描述:用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 首先定义两个栈 Stack<Integer> stack1 = new Stack<I ...

  3. 剑指Offer - 九度1512 - 用两个栈实现队列

    剑指Offer - 九度1512 - 用两个栈实现队列2013-11-29 21:23 题目描述: 用两个栈来实现一个队列,完成队列的Push和Pop操作.队列中的元素为int类型. 输入: 每个输入 ...

  4. 剑指offer【05】- 用两个栈实现队列(java)

    题目:用两个栈实现队列 考点:栈和队列 题目描述:用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 解题思路:每次psuh是时先将stack2清空放入stck1(保 ...

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

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

  6. 剑指offer(9)——用两个栈实现队列

    题目: 用两个栈实现一个队列.队列的声明如下,请实现它的两个函数appendTail和deleteHead,分别完成在队列尾部插入结点和在队列头部删除结点的功能. 思路: 首先定义两个栈stack1. ...

  7. JS 剑指Offer(六) 用两个栈实现队列

    题目:用两个栈实现队列,实现它的两个函数appendTail和deleteHead,分别完成在队列尾部插入整数和在队列头部删除整数,若队列中没有元素deleteHead返回-1 分析:在队列的尾部插入 ...

  8. 剑指offer(5)用两个栈实现队列

    题目描述 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 题目分析 栈是先进后出,队列是先进先出,因此两个栈,一个用来push,一个用来pop,同时注意下两个栈不 ...

  9. 剑指Offer_编程题之用两个栈实现队列

    题目描述 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型.

  10. 【剑指Offer】5、用两个栈实现队列

      题目描述:   用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型.   解题思路:   本题的基本意图是:用两个后入先出的栈来实现先入先出的队列.对于这个问题,我 ...

随机推荐

  1. 杭电2059(dp)

    龟兔赛跑 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  2. Find the largest multiple of 3 解答

    Question Given an array of non-negative integers. Find the largest multiple of 3 that can be formed ...

  3. 理解mcelog如何工作

    前言 本文,带你了解几个问题? 本文重点,主要看案例2,带你很好的理解mcelog如何工作的? mcelog的干什么的? mcelog 是 x86 的 Linux 系统上用来 检查硬件错误,特别是内存 ...

  4. 《Java程序员面试笔试宝典》之为什么需要public static void main(String[] args)这个方法

    public staticvoid main(String[] args)为Java程序的入口方法,JVM在运行程序的时候,会首先查找main方法.其中,public是权限修饰符,表明任何类或对象都可 ...

  5. 学艺不精,又被shell的管道给坑了

    我用过bash shell,而且时间不短了.但我从来没学过shell,至少没有像C++这么认真去学.平时写些基本的脚本没问题,不懂也可以google.百度.可在2014最后一天,掉坑里了. 其实脚本也 ...

  6. 格而知之16:我所理解的Block(3)

    23.在前文中的例子中,Block结构体里的isa指针还没有详细讲解,这个指针都被置向了_NSConcreteStackBlock,它标识了Block的类型. 其实除了_NSConcreteStack ...

  7. 面试前的准备---C#知识点回顾----04

    播下的种子,慢慢开始发芽收获了,陆陆续续offer就来了,该轮到我挑的时候了 今天面试的一家公司,技术问的相对宽广和细致,程度令人发指 1.谈谈ViewState 这个问题,回答的好,工资翻一级 基本 ...

  8. HTML与CSS入门——第三章 理解HTML和XHTML的关系

    知识点: 1.以HTML创建一个简单网页的方法 2.包含每个网页必须有的所有HTML标签的方法 3.用段落和换行组织页面的方法 4.用标题组织内容的方法 5.HTML.XML.XHTML和HTML5之 ...

  9. Java异常基础Exception

    异常指不期而至的各种状况,如:文件找不到.网络连接失败.非法参数等.异常是一个事件,它发生在程序运行期间,干扰了正常的指令流程.Java通 过API中Throwable类的众多子类描述各种不同的异常. ...

  10. 【mysql】1206 SQLSTATE: HY000 (ER_LOCK_TABLE_FULL) 问题

    最近在做一个项目,其中一需求是:部分数据库中的数据需要定时删除掉(满足一定条件,比如7天前的数据都不保留) 最初的执行方法: 使用Quartz定时执行数据库操作,进行数据删除,数据库操作使用delet ...