zoukankan      html  css  js  c++  java
  • 用两个栈实现队列和用两个队列实现栈

    题目一:用两个栈实现队列,队列的声明如下,请实现它的两个函数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 }
  • 相关阅读:
    jstack使用-倒出线程堆栈
    sentos nginx安装
    阿里云主机添加云磁盘
    redis 安装并设置为开机启动服务
    curl命令使用小结[转]
    FormView控件下DropDownList是否可以绑定
    数据绑定之DataFormatString
    GridView控件RowDataBound事件中获取列字段值的几种途径 !!!
    怎么用SQL语句备份和恢复数据库?
    XtraReports 入门教程
  • 原文地址:https://www.cnblogs.com/General-up/p/5405458.html
Copyright © 2011-2022 走看看