#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;
}