C++笔试题(剑指offer 面试题7 两个栈实现队列)

#ifndef F_FIND_WORK_TEST6_TWO_STACK_TO_QUEUE_20171219_JHASKDFJHASF_H_
#define F_FIND_WORK_TEST6_TWO_STACK_TO_QUEUE_20171219_JHASKDFJHASF_H_

#include <stdio.h>
#include <stack>

/*
剑指offer 面试题7 (P59)
两个栈实现队列,队列的声明如下,请实现它的两个函数 AddData和DeleteData,分别实现在队列尾部增加数据,在头部删除数据功能

1)栈(stack):后进先出
2)队列(queue):先进先出
3)stackA:用于存储数据
4)stackB:用于满足临时操作数据。
5)操作前,将数据存储于stackA
6)操作时,将数据从stackA移入stackB,对stackB做删除等操作
7)操作后,将数据从stackB移入stackA.
*/

template<class T>
class F_StackToQueue
{
public:
    F_StackToQueue();
    ~F_StackToQueue();

public:
    //! 增加数据
    BOOL AddData(const T &tData);
    //! 删除数据
    T DeleteData();
    //! 获取数据长度
    int GetDataSize();
    //! 获取数据
    T GetData();

private:
    //! 存储数据
    stack<T> m_sStackA;
    //! 处理操作的数据
    stack<T> m_sStackB;
};

template<class T>
F_StackToQueue<T>::F_StackToQueue()
{}

template<class T>
F_StackToQueue<T>::~F_StackToQueue()
{}

template<class T>
BOOL F_StackToQueue<T>::AddData(const T &tData)
{
    m_sStackA.push(tData);
    return TRUE;
}

template<class T>
T F_StackToQueue<T>::DeleteData()
{
    //如果m_sStackB中没数据,则从m_sStackA中数据移入
    if(m_sStackB.empty())
    {
        while (m_sStackA.size()>0)
        {
            T tTempData = m_sStackA.top();

            m_sStackA.pop();
            m_sStackB.push(tTempData);
        }
    }

    if(m_sStackB.empty())
    {
        TRACE("当前为空链表");
        return NULL;
    }

    T tDeleteData = m_sStackB.top();
    m_sStackB.pop();

    return tDeleteData;
}

template<class T>
int F_StackToQueue<T>::GetDataSize()
{
    return m_sStackA.size() + m_sStackB.size();
}

//获取数据
template<class T>
T F_StackToQueue<T>::GetData()
{
    if(m_sStackB.empty())
    {
        while (m_sStackA.size()>0)
        {
            T tTempData = m_sStackA.top();

            m_sStackA.pop();
            m_sStackB.push(tTempData);
        }
    }

    if(m_sStackB.empty())
    {
        TRACE("当前为空链表");
        return NULL;
    }

    return m_sStackB.top();
}

//测试:两个栈实现队列
void F_Test6_TwoStackToQueue()
{
    F_StackToQueue<int> qTest;
    qTest.AddData(1);
    qTest.AddData(2);
    qTest.AddData(3);
    qTest.AddData(4);

    int nTest(0);
    nTest = qTest.DeleteData(); //1
    nTest = qTest.DeleteData(); //2

    qTest.AddData(8);
    nTest = qTest.DeleteData(); //3
    nTest = qTest.DeleteData(); //4
    nTest = qTest.DeleteData(); //8
    nTest = qTest.DeleteData(); //0
    nTest = qTest.DeleteData(); //0

    qTest.AddData(12);
    nTest = qTest.DeleteData(); //12

    qTest.AddData(92);
    nTest = qTest.GetData();    //92

    nTest = qTest.DeleteData(); //92
    nTest = qTest.GetData();    //0
}

#endif//F_FIND_WORK_TEST6_TWO_STACK_TO_QUEUE_20171219_JHASKDFJHASF_H_
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值