老钟古

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

思路参考: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为空,则队列为空。

代码实现,是参考链接文章的。

 

代码
 1 #include <iostream>
 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 }

 

 

posted on 2010-09-25 21:05  老钟古  阅读(1058)  评论(0编辑  收藏  举报