用两个栈来模拟队列,注意,当pop元素之后,不需要把元素重新恢复成原来的位置。写了好久的c++,今天终于尝试到用template来写类了,感觉不错。
#include <iostream>
#include <stack>
template<class DataType>
class Queue
{
public:
Queue():m_stack1(), m_stack2(){}
~Queue(){}
// 插入元素
void push(DataType data);
// 删除元素
void pop();
// 获取队首元素
DataType front();
// 是否为空
bool empty();
private:
std::stack<DataType> m_stack1;
std::stack<DataType> m_stack2;
};
// 插入元素
template<class DataType>
void Queue<DataType>::push(DataType data)
{
this->m_stack1.push(data);
}
// 删除元素
template<class DataType>
void Queue<DataType>::pop()
{
// 如果第二栈为空
if (this->m_stack2.empty())
{
// 将第一个栈中的元素全部搬到第二栈里面
while(!this->m_stack1.empty())
{
this->m_stack2.push(this->m_stack1.top());
this->m_stack1.pop();
}
}
// 删除元素
this->m_stack2.pop();
}
// 获取队首元素
template<class DataType>
DataType Queue<DataType>::front()
{
// 如果第二栈为空
if (this->m_stack2.empty())
{
// 将第一个栈中的元素全部搬到第二栈里面
while(!this->m_stack1.empty())
{
this->m_stack2.push(this->m_stack1.top());
this->m_stack1.pop();
}
}
// 返回第二栈的栈顶元素
return this->m_stack2.top();
}
// 是否为空
template<class DataType>
bool Queue<DataType>::empty()
{
// 只有两个栈都为空,才算空
return (this->m_stack1.empty() && this->m_stack2.empty());
}
int main()
{
bool a = (false || false);
Queue<int> q;
q.push(1);
q.push(2);
q.pop();
q.push(3);
q.pop();
while(!q.empty())
{
std::cout<<q.front()<<std::endl;
q.pop();
}
return 0;
}