《剑指offer》面试题7:用两个栈实现队列。
题目:用两个栈实现一个队列。队列的声明如下,请实现它的两个函数appendTail和deleteHead,分别完成在队列尾部插入结点和在队列头部删除结点的功能。
template<typename T>
class CQueue
{
public:
CQueue(void);
~CQueue(void);
void appendTail(const T &);
T deleteHead();
private:
stack<T> stack1;
stack<T> stack2;
};
我们试着用两个栈来模拟队列的操作,发现如下可行操作:
完整代码实现:
/**
* 面试题7:用两个栈实现队列
*
* 题目:用两个栈实现一个队列。队列的声明如下,请实现它的两个函数appendTail和deleteHead,
* 分别完成在队尾插入结点和在队头删除结点的功能。
*
* @date: 2014-06-27
*/
#include <iostream>
#include <stack>
#include <stdexcept>
using namespace std;
template<typename T>
class CQueue
{
public:
CQueue(void);
~CQueue(void);
void appendTail(const T &);
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.empty())
{
while (!stack1.empty())
{
T &data = stack1.top();
stack1.pop();
stack2.push(data);
}
}
if (stack2.empty())
throw runtime_error("queue is empty");
T ret = stack2.top();
stack2.pop();
return ret;
}
void Test()
{
CQueue<int> q;
q.appendTail(1);
q.appendTail(2);
q.appendTail(3);
q.appendTail(4);
cout << q.deleteHead() << endl;
cout << q.deleteHead() << endl;
cout << q.deleteHead() << endl;
cout << q.deleteHead() << endl;
//cout << q.deleteHead() << endl;
}
int main()
{
Test();
return 0;
}
相关题目:用两个队列实现一个栈。
同样地,画图进行模拟操作,找规律:
代码实现:
/**
* 用两个队列实现一个栈
*/
#include <iostream>
#include <queue>
#include <stdexcept>
using namespace std;
template<typename T>
class CStack
{
public:
void push(const T &);
void pop();
T top();
private:
queue<T> queue1;
queue<T> queue2;
};
template<typename T>
void CStack<T>::push(const T &element)
{
if (!queue1.empty())
queue1.push(element);
else if (!queue2.empty())
queue2.push(element);
else
queue1.push(element);
}
template<typename T>
void CStack<T>::pop()
{
if (!queue1.empty())
{
while (queue1.size() != 1)
{
T data = queue1.front();
queue1.pop();
queue2.push(data);
}
queue1.pop();
}
else if (!queue2.empty())
{
while (queue2.size() != 1)
{
T data = queue2.front();
queue2.pop();
queue1.push(data);
}
queue2.pop();
}
else
throw runtime_error("stack is empty");
}
template<typename T>
T CStack<T>::top()
{
if (!queue1.empty())
return queue1.back();
else if (!queue2.empty())
return queue2.back();
else
throw runtime_error("stack is empty");
}
void Test()
{
CStack<int> s;
s.push(1);
s.push(2);
cout << s.top() << endl;
s.pop();
s.push(3);
s.push(4);
cout << s.top() << endl;
s.pop();
cout << s.top() << endl;
s.pop();
cout << s.top() << endl;
s.pop();
cout << s.top() << endl;
}
int main()
{
Test();
return 0;
}