《劍指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;
}