您的位置:首页 > 编程语言 > C语言/C++

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

2017-12-20 15:34 369 查看
#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_
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  面试题