剑指offer-面试7:用两个栈实现队列(栈和队列)

  • 题目
  • 分析
  • 测试用例代码
  • 本题考点
  • 相关题目

题目

用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 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;
};

分析

在上述队列的声明中可以看出,一个队列包含了两个栈stack1和stack2,因此这道题的意图是要求我们操作这两个“先进后出”的栈实现一个“先进先出”的队列CQueue。

可以将一个栈作为插入栈(stack1),另一个作为删除栈(stack2)。即,入队的时候需要往stack1里插入,出队的时候,需要在stack2里删除。

测试用例&代码

(1)往空的队列里添加、删除元素

(2)往非空的队列里添加、删除元素

(3)连续删除元素直至队列为空

// QueueWithTwoStacks.cpp : Defines the entry point for the console application.
//

// 《剑指Offer——名企面试官精讲典型编程题》代码
// 著作权所有者:何海涛

#include "stdafx.h"
#include "Queue.h"

void Test(char actual, char expected)
{
    if(actual == expected)
        printf("Test passed.\n");
    else
        printf("Test failed.\n");
}

int _tmain(int argc, _TCHAR* argv[])
{
    CQueue<char> queue;

    queue.appendTail('a');
    queue.appendTail('b');
    queue.appendTail('c');

    char head = queue.deleteHead();
    Test(head, 'a');

    head = queue.deleteHead();
    Test(head, 'b');

    queue.appendTail('d');
    head = queue.deleteHead();
    Test(head, 'c');

    queue.appendTail('e');
    head = queue.deleteHead();
    Test(head, 'd');

    head = queue.deleteHead();
    Test(head, 'e');

    return 0;
}

#pragma once
#include <stack>
#include <exception>

using namespace std;

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

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

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

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

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

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;
}

本题考点

(1)对栈和队列的理解

(2)写与模块相关的代码的能力

(3)分析复杂问题的能力。本题解法的代码虽然只有20几行,但形成正确的思路却不容易。应聘者能否通过具体的例子分析问题,通过画图的手段把抽象的问题形象化,从而解决这个相对比较复杂的问题,是能否顺利通过面试的关键。

相关题目

用两个队列实现一个栈

你可能感兴趣的:(队列,栈,剑指offer)