• 数据结构和算法之栈和队列一:两个栈模拟一个队列以及两个队列模拟一个栈


      今天我们需要学习的是关于数据结构里面经常看到的两种结构,栈和队列。可以说我们是一直都在使用栈,比如说在前面递归所使用的的系统的栈,以及在链表倒序输出时介绍的自定义栈类Stack和使用系统的栈进行递归。那么,在这里我们就讲述一下这两个比较具有特色的或者说关系比较紧密的数据结构之间的互相实现问题。

           一:两个栈模拟实现一个队列: 栈的特点是先进后出,然而队列的特点是先进先出。

        

    public class Queen(Stack s1,Stack s2){
         //实现插入的方法
         public void add(int num){
                s1.push(num);
         }
         //删除
         public void delete(){
              //判断s2是否有值
              if(s2.size() > 0){
                     s2.pop();
              }else{
                     //先把s1里面的内容加入s2
                     for(int i = 0;i < s1.size() - 1;i++){
                           s2.push(s1.pop());
                     }
                     //把s1剩下的一个节点直接弹出就行
                     s1.pop();
              }
         }
    }                            

       两个栈模拟一个队列的思路和算法还是比较简单的,只需要注意细节就行,别让自己的算法出错。

       二:用两个队列模拟一个栈:

            

     1 public class MyQueue(){
     2       //声明两个模拟的队列
     3      Queue<Integer> q1 = new ArrayDeque<>();   
     4      Queue<Integer> q2 = new ArrayDeque<>();
     5      //添加操作
     6      public void push(int num){
     7          //判断两个队列是否都为空
     8          if(q1.isEmpty() && q2.isEmpty()){
     9                //优先考虑q1执行增加操作
    10                q1.offer(num);
    11          }else if(q1.isEmpty()){
    12                q2.offer(num);
    13          }else{
    14                 q1.offer(num);
    15          }
    16      }
    17      //删除操作
    18      public int pop(){
    19           if(q1.isEmpty() && q2.isEmpty()){
    20                throw new Expection("空栈无数据弹出");      
    21           }else if(q1.isEmpty()){
    22                for(int i = 0;i < q2.size() - 1;i++){
    23                      q1.offer(q2.poll);
    24                }
    25                return q2.poll();
    26          }else{
    27                  for(int i = 0;i < q1.size() - 1;i++){
    28                      q2.offer(q1.poll);
    29                }
    30                return q1.poll();
    31          }
    32      }
    33 }    

      队列模拟栈也好,栈模拟队列也罢,其实无非就是抓住队列先进先出,栈后进先出的特点然后进行实现他们的增加删除操作。但是在这个过程中注意自己的严谨性很重要。

  • 相关阅读:
    DotNet的JSON序列化与反序列化
    DotNet指定文件显示的尺寸
    将文本文件的内容存储在DataSet中的方法总结
    Apple的LZF算法解析
    DotNet常用排序算法总结
    C#创建安全的字典(Dictionary)存储结构
    C#创建安全的栈(Stack)存储结构
    转化代码:添加在您网页中用户触发转化行为之后的地方。添加方法
    nginx配置ThinkPHP5二级目录访问
    好久没写原生的PHP调用数据库代码了分享个
  • 原文地址:https://www.cnblogs.com/zslli/p/8042777.html
Copyright © 2020-2023  润新知