#pragma once
#include<queue>
#include<stack>
using namespace std;
template<typename T>
class CStack
{
public:
CStack(void);
~CStack(void);
void push(const T& num);
T pop();
T top();
void swapQueue();// 交換dataQueue和helpQueue
private:
queue<T>dataQueue;
queue<T>helpQueue;
};
template<typename T>
inline CStack<T>::CStack(void)
{
}
template<typename T>
inline CStack<T>::~CStack(void)
{
}
template<typename T>
inline void CStack<T>::push(const T& num)
{
dataQueue.push(num);
}
template<typename T>
inline T CStack<T>::pop()
{
if (dataQueue.empty()) {
throw std::runtime_error("queue is empty");
}
else {
while (dataQueue.size() > 1) { // 當dataQueue
helpQueue.push(dataQueue.front());
dataQueue.pop();
}
T res = dataQueue.front(); // 這個dataQueue的最後元素也就是stack的棧頂元素
dataQueue.pop(); // dataQueue已經為空,helpQueue存放n-1個數
swapQueue(); // 交換二個隊列
return res;
}
}
template<typename T>
inline T CStack<T>::top()
{
if (dataQueue.empty()) {
throw std::runtime_error("queue is empty");
}
else {
while (dataQueue.size() > 1) { // 當dataQueue
T data = dataQueue.front();
dataQueue.pop();
helpQueue.push(data);
}
T res = dataQueue.front(); // 這個dataQueue的最後元素也就是stack的棧頂元素
dataQueue.pop(); // 此時dataQueue已經為空,helpQueue存放n-1個數
helpQueue.push(res); // 擷取top元素需要将原來資料傳回
swapQueue();
return res;
}
}
template<typename T>
inline void CStack<T>::swapQueue()
{
std::queue<T> tmp = dataQueue;
dataQueue = helpQueue;
helpQueue = tmp;
}