题目描述:两个栈实现队列,给定了队列声明,实现函数appendtail和deletehead。分别为在队尾插入节点和在队头删除节点。
解题思路:栈的特点是先进后出,而队列为先进先出,我们可以用两次先进后出得到先进先出,就像数学中的负负得正一样。实现。比如说我们把所有节点都插入1号栈中,比如插入的是abc,当我们要在队头删除节点理论上要先删a,但是因为栈的特点只能先删c,这时候我们2号栈是空的,我们可以把1号栈的数据逐个放入2号栈中,这样一来二号栈中就是cba,我们获取栈顶元素时就可以获取到题目要求的c。所以核心思想就是只要2号栈不空,我们每次删除的队头节点就从2号栈中出,如果2号栈为空我们就把1号栈的数据逐个放到2号栈中然后再从2号栈中。
代码如下
#include <stack>
#include <iostream>
#include <stdio.h>
using namespace std;
template <typename T>
class CQueue
{
public:
CQueue(){};
~CQueue(){};
void appendTail(const T & node);//在队列尾部插入结点
T deleteHead();//在队列头部删除节点
private:
stack <T> stack1;
stack <T> stack2;
};
template<typename T> void CQueue<T>::appendTail(const T& element)//把数据都放入stack1
{
stack1.push(element);
}
template<typename T> T CQueue<T>::deleteHead()//删除元素步骤,当stack2不为空时,在stack2顶部弹出,当stack2为空时,把stack1中的元素逐个弹出然后再从stack2顶部弹出
{
if(stack2.size()<=0)
{
while(stack1.size()>0)
{
T head=stack1.top();
stack1.pop();
stack2.push(head);
}
}
T head=stack2.top();
stack2.pop();
return head;
}
int main()
{
CQueue <int> q;
for(int i=0;i<5;i++)
{
q.appendTail(i);
}
q.deleteHead();
}