用两个栈实现队列。队列声明如下,请实现它的两个函数append_tail和delete_head在队列的队尾添加数据和删除队头
class Queue_by_stack
{
public:
Queue_by_stack(){};
~Queue_by_stack(){};
void append_tail(const T& node);
T delete_head();
void Show_Queue(void); //从队首到队尾依次输出队列数据
protected:
private:
stack<T> stack1;
stack<T> stack2;
};
class Queue_by_stack
{
public:
Queue_by_stack(){};
~Queue_by_stack(){};
void append_tail(const T& node);
T delete_head();
void Show_Queue(void); //从队首到队尾依次输出队列数据
protected:
private:
stack<T> stack1;
stack<T> stack2;
};
分析:队列的特性是先进后出,比如对于1,2,3,4序列来说,首先将序列压入栈(stack1和stack2随便选一个),要实现delete_head的话,不能对stack1进行pop,因为这时stack1的top值是4,我们要删除的是1,注意这时候stack2还没有利用,如果我将stack1里的数据都逐个pop,push进去stack2,对于stack2;来说,那不就正好相当于原序列吗?实现delete_head的话只需对stack2进行pop就行了,append_tail的话只需往空的stack1里面push就行了。代码实现如下
#include <stack>
#include <iostream>
using namespace std;
template<typename T>
class Queue_by_stack
{
public:
Queue_by_stack(){};
~Queue_by_stack(){};
void append_tail(const T& node);
T delete_head();
void Show_Queue(void); //从队首到队尾依次输出队列数据
protected:
private:
stack<T> stack1;
stack<T> stack2;
};
template<typename T>
void Queue_by_stack<T>::Show_Queue(void)
{
T tmp;
stack<T> S1(stack1); // 将stack1的数据copy到S1
stack<T> S2(stack2);
cout<<"\nThis is Show_Queue !\n";
while(!S2.empty()) //先把S2中的所有数据清仓输出
{
cout<<S2.top()<<" ";
S2.pop();
}
while(!S1.empty()) //再把S1中的数据全部倒进S2
{
tmp = S1.top();
S2.push(tmp);
S1.pop();
}
while(!S2.empty())//再把S2中的所有数据清仓输出
{
cout<<S2.top()<<" ";
S2.pop();
}
}
template<typename T>
T Queue_by_stack<T>::delete_head()
{
T tmp;
if (stack2.empty()) //删除元素 先判断栈2是否为空
{
while (!stack1.empty()) //栈2为空栈,把栈1中的数据全部倒入栈2
{
tmp = stack1.top();
stack2.push(tmp);
stack1.pop();
}
}
if (stack2.empty()) //栈2仍为空,说明队列为空
{
return -1;
}
tmp = stack2.top();//如果栈2 不空的情况下,则栈2的栈顶就是队列的队首
stack2.pop();
return tmp;
}
template<typename T>
void Queue_by_stack<T>::append_tail( const T& node )
{
stack1.push(node);
}
int main()
{
Queue_by_stack<char> my_queue;
my_queue.append_tail('a');
my_queue.append_tail('b');
my_queue.append_tail('c');
my_queue.Show_Queue();
my_queue.delete_head();
my_queue.delete_head();
my_queue.Show_Queue();
my_queue.append_tail('d');
my_queue.append_tail('e');
my_queue.Show_Queue();
my_queue.delete_head();
my_queue.Show_Queue();
}
/**********************************
入栈顺序是 a b c d e
运行结果:
This is Show_Queue !
a b c
This is Show_Queue !
c
This is Show_Queue !
c d e
This is Show_Queue !
d e
***********************************/