#pragma once
#define NDEBUG
#include <iostream>
#include<stack>
#include<assert.h>
using namespace std;
//#include "CMyStack.h"
template<typename T>
class CQueue
{
public:
void push(const T& x);//入队列
void Pop();//出队列
//队列的队头位于栈2的栈顶
//只要栈2不空,那就返回栈2的栈顶元素
//如果栈2为空,那就把栈1中的所有元素全部压入栈2中,再取栈顶
T& Front() {//获取队头元素
assert(!stack1.empty());//Debug专用
assert(!stack2.empty());//且必须包含头文件#include<assert.h>
if (stack2.empty()) {
while (!stack1.empty()) {
stack2.push(stack1.top());
stack1.pop();
}
}
return stack2.top();
}
private:
stack<T> stack1;
stack<T> stack2;
};
template<typename T>
inline void CQueue<T>::push(const T& x)
{
stack1.push(x);
}
template<typename T>
inline void CQueue<T>::Pop()
{
//如果两个栈都是空栈,此时说明队列是空的
if (stack1.empty() && stack2.empty())
cout << "this queue is empty" << endl;
//如果栈2中有元素,那出队列就出栈2中的
if (!stack2.empty()) {
stack2.pop();//栈2的栈顶相当于队头 也就是要出的位置
//队列总是队头出对尾入
}
//此时表明栈2已是空栈,再要出队列的话,那就需要把栈1中的所有元
//素入栈到栈2中,注意一定要是栈1中的所有元素都入栈到栈2中
else {
while (stack1.size() > 0) {
stack2.push(stack1.top());
stack1.pop();
}
stack2.pop();
}
}