#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_
C++笔试题(剑指offer 面试题7 两个栈实现队列)
最新推荐文章于 2020-04-10 01:29:26 发布