算法-两个栈实现队列

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

template <typename T> class CQueue
{
public:
    CQueue(void);
    ~CQueue(void);

    // 在队列末尾添加一个结点
    void appendTail(const T& node);

    // 删除队列的头结点
    T deleteHead();

private:
    stack<T> stack1;
    stack<T> stack2;
};

解题思路: 首先这个题目要完成两个栈实现队列,其次还涉及到C++类和模板的一些知识,先说前面: 我们知道,是一种后入先出的结构,而队列恰恰相反,是一种先入先出的结构,需要用栈实现队列,这意味着我们有现成的push和pop可以用,以实现入队和出队。

现在有两个栈stack1和stack2,我们向stack1依次压入a,b,c三个值,stack2为空:

此时出栈的话,顺序为c,b,a,但是出队的顺序应该是a,b,c,为了实现想要的出队顺序,我们可以把stack1里面的内容依次压入stack2中:

此时再将stack2内的内容做出栈,将弹出a:

下面讨论再次入队的情况,将d压入stack1,此时两个栈的情况:

此时出队的话,在stack2中还有值的话,直接出栈stack2,弹出b,c。此时stack2中已经没有值了,需要再次从stack1中出栈到stack2中入栈,然后再次stack2的出栈,弹出d。这与队列的出队形式完全相同:

我们可以根据上面的实验整理出一个编程思路,如果stack2中没有值,就做stack1到stack2的压栈,如果有就做stack2的出栈,而不管stack1有没有值都可以做入栈。

下面需要考虑的是C++的模板,使用模板的目的就是能够编写与类型无关的代码,在上面例子中使用了a,b,c,d,那么在实例化对象时T就行该是char,比如实例化一个叫做queue的对象:

CQueue<char> queue;

此外,由于deleteHead函数return不为空,所以他的类型是T,此外appendTail和deleteHead都是在类内声明,类外定义的函数,所以在定义函数时要加类名。

代码实现

template <typename T> CQueue<T>::~CQueue(void)
{
}

template<typename T> void CQueue<T>::appendTail(const T& element)
{
    stack1.push(element);
} 

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 new exception("queue is empty");

    T head = stack2.top();
    stack2.pop();

    return head;
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏大内老A

采用一个自创的"验证框架"实现对数据实体的验证[编程篇]

昨天晚上突发奇想,弄了一个简易版的验证框架,用于进行数据实体的验证。目前仅仅实现基于属性的声明式的验证,即通过自定义特性(Custom Attribute)的方...

2366
来自专栏纯洁的微笑

Java 8的新特性—终极版

1. 简介 毫无疑问,Java 8是Java自Java 5(发布于2004年)之后的最重要的版本。这个版本包含语言、编译器、库、工具和JVM等方面的十多个新特...

3716
来自专栏Android机动车

Java 基础(六)——集合源码解析 Queue

Queue继承自 Collection,我们先来看看类结构吧,代码量比较少,我直接贴代码了。

531
来自专栏陈树义

POI 操作Excel疑难点笔记

在POI中,我们可以通过Workbook, Sheet, Row, Cell 对象分别对应Excel文件、工作表、行、单元格。 在POI的使用中,我遇到了几个非...

3506
来自专栏好好学java的技术栈

一文看透java8新特性

毫无疑问,Java 8发行版是自Java 5(发行于2004,已经过了相当一段时间了)以来最具革命性的版本。Java 8 为Java语言、编译器、类库、开发工具...

662
来自专栏java思维导图

JAVA容器-自问自答学ArrayList

前言 这次我和大家一起学习HashMap,HashMap我们在工作中经常会使用,而且面试中也很频繁会问到,因为它里面蕴含着很多知识点,可以很好的考察个人基础。但...

3509
来自专栏JavaWeb

Mybatis源码-XXXmapper.xml中的resultMap标签解析过程

1153
来自专栏老马说编程

(85) 注解 / 计算机程序的思维逻辑

上节我们探讨了反射,反射相关的类中都有方法获取注解信息,我们在前面章节中也多次提到过注解,注解到底是什么呢? 在Java中,注解就是给程序添加一些信息,用字符...

1925
来自专栏Python疯子

Python selenium — 一定要会用selenium的等待,三种等待方式解读

很多人在群里问,这个下拉框定位不到、那个弹出框定位不到…各种定位不到,其实大多数情况下就是两种问题:1 有frame,2 没有加等待。殊不知,你的代码运行速度是...

711
来自专栏犀利豆的技术空间

Redis 的基础数据结构(二) 整数集合、跳跃表、压缩列表

上篇文章写了 Redis 基础数据结构的可变字符串、链表、字典。大家可以点击链接查看。今天我们继续研究 Redis 的基础数据结构。

643

扫码关注云+社区