用两个栈实现队列和用两个队列实现栈

用两个栈实现队列和用两个队列实现栈

题目一:用两个栈实现队列,队列的声明如下,请实现它的两个函数appendTail和deleteHead,分别完成在队列的尾部插入节点和在队列的头部删除节点的功能。

template <class T>

class CQueue

{
  CQueue();

  ~CQueue();

  void appendTail(const T& node);

  T deleteHead();

private:

  stack<T> stack1;

  stack<T> stack2;

};

用两个栈实现队列和用两个队列实现栈

 如上图所示:每次插入结点时都插入到stack1,例如依次插入a,b,c,然后为了达到队列的先进先出特性也就是要删除a,但是stack1只有栈的特性,只会先输出c,故需要把stack1中的数据依次的输出到stack2中,存入stack2的序列分别为c,b,a,此时stack2的栈顶是a,也就是我们需要输出的元素。也就是说每次的插入都需要在stack1中进行,删除操作首先需要检查stack2是否为空,若不为空,则直接输出stack2的栈顶,否则依次把stack1中的元素全部导入到stack2然后再输出。

故可以写出简单的代码如下:

 1 #include<iostream>
 2 #include<stack>
 3 using namespace std;
 4 template <class T>
 5 class CQueue{
 6     CQueue();
 7     ~CQueue();
 8     void appendTail(const T& node);
 9     T deleteHead();
10 private:
11     stack<T> stack1;
12     stack<T> stack2;
13 };
14 template <class T>
15 void CQueue<T>::appendTail(const T& node)
16 {
17     stack1.push(node);//入队列全放入stack1
18 }
19 template <class T>
20 T CQueue<T>::deleteHead()
21 {
22     if (stack2.size() <= 0)
23     {
24         if (stack1.size() <= 0)
25             throw exception("the queue is empty");//两个栈都为空
26         else{//stack1不为空,stack2为空,则stack1全部入stack2
27             while (stack1.size() > 0){
28                 T value = stack1.top();
29                 stack2.push(value);
30                 stack1.pop();
31             }
32         }
33     }//stack2不为空则直接输出
34     T r_value = stack2.top();
35     stack2.pop();
36     return r_value;
37 }

 

题目二:用两个队列实现栈,栈的声明如下,分别实现栈的push()函数和topAnddelete()函数,用来完成在栈的顶部插入和删除(返回栈顶值)的操作

template <class T>

class CStack{
  CStack();

  ~CStack();

  void push(const T& node);

  T topAnddelete();

private:

  queue<T> queue1;

  queue<T> queue2;

};

用两个栈实现队列和用两个队列实现栈

用两个栈实现队列和用两个队列实现栈

 

也就是说,根据上面的分析每次删除操作前,总有一个queue是空的,一个queue是满的(当然两个都为空时我们的删除操作直接抛出异常就可以了),然后满的那个queue一定是我们要在其上完成删除操作的,需要把满的queue除队尾元素之外的所有元素都移到另一个空的queue,然后再删除这个唯一的元素(删除后必然又有一个queue为空)。所以每次只需要检测哪个queue不为空然后完成相应的操作即可。

代码如下:

 1 #include<iostream>
 2 #include<queue>
 3 using namespace std;
 4 template <class T>
 5 class CStack{
 6 public:
 7         CStack();
 8         ~CStack();
 9         void push(const T& node);
10         T topAnddelete();
11 private:
12         queue<T> queue1;
13         queue<T> queue2;
14 };
15 template <class T>
16 void CStack<T>::push(const T &node)//每次都选择插入queue1
17 {
18     queue1.push(node);
19 }
20 template<class T>
21 T CStack<T>::topAnddelete()
22 {
23     if (queue1.empty() && queue2.empty()){//若为空抛出异常
24         throw exception("the stack is empty");
25     }
26     else if(!queue1.empty() && queue2.empty()){//queue1不为空,queue2为空
27         while (queue1.size() > 1){
28             T value = queue1.front();
29             queue2.push(value);
30             queue1.pop();
31         }
32         T r_value = queue1.front();
33         queue1.pop();
34         return r_value;
35     }
36     else{//queue2不为空,queue1为空
37         while (queue2.size() > 1){
38             T value = queue2.front();
39             queue1.push(value);
40             queue2.pop();
41         }
42         T r_value = queue2.front();
43         queue2.pop();
44         return r_value;
45     }
46 }

 

posted @ 2016-04-18 18:35 General_up 阅读(...) 评论(...) 编辑 收藏