思路参考:http://hi.baidu.com/liangjw821/blog/item/74c98ed520f299cc51da4b86.html
对于这个题目,还可以考虑用两个队列实现栈的功能,其实对于这种类型的题目,我们应该要做到举一反三,最近因为要开始准备参加10月份的笔试,所以一直在看数据结构,争取能够做得好一些(扯远了)。
相信大家都知道栈和队列的特性,栈中的元素是后进先出的,队列中的元素是先进先出的。由他们的特性我们思考一下就很快可以想到怎么来实现,
对于入队操作,我们可以对一个栈(stack1)进行进栈操作。
对于出队操作,我们可以将stack1中的元素进行出栈操作,并且将每个出栈的元素压入进stack2中,则此时栈中的元素就与stack1中的顺序刚好相反。举个例子:
stack1 进栈元素: a, b, c, d; 出栈顺序:d, c, b, a,出栈顺序也是stack2中的元素由下向上的顺序,可以画个图实现一下。图画的不好O(∩_∩)O~。
stack1 stack2
如果stack2不为空,我们则可以将元素进行出栈,这样就可以实现队列的先进先出,
如果stack2为空时,
(1)若stack1不为空,则依次弹出栈 stack1的数据,放入栈 stack2 中,再弹出栈 stack2 的数据。
(2)若stack1为空,则队列为空。
代码实现,是参考链接文章的。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
2 #include <stack>
3 using namespace std;
4
5 template <typename T>
6 class Queue {
7 public:
8 Queue() {}
9 ~Queue() {}
10
11 void AppendTail( const T& node);
12 T DeleteHead();
13 private:
14 stack<T> m_stack1;
15 stack<T> m_stack2;
16 };
17
18 template <typename T>
19 void Queue<T>::AppendTail( const T& node ) {
20 m_stack1.push( node );
21 }
22
23 template <typename T>
24 T Queue<T>::DeleteHead() {
25 if( m_stack2.empty() ) { //B栈为空
26
27 while ( m_stack1.empty() != true ) {
28 T t = m_stack1.top(); //A栈出栈操作,同时B栈入栈操作
29
30 m_stack1.pop();
31 m_stack2.push( t );
32 }
33 }
34 T t = m_stack2.top(); //B栈不空
35 m_stack2.pop(); //B栈直接出栈操作
36 return t;
37 }