前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >算法:栈和队列-理论

算法:栈和队列-理论

作者头像
营琪
发布2019-11-04 16:51:24
4610
发布2019-11-04 16:51:24
举报
文章被收录于专栏:营琪的小记录


栈,stack

也可以翻译成堆栈,但是不能翻译成堆(heap)。

百度百科关于栈的介绍是

它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。

我们可以吧栈简单的想象成一堆碟子,做饭的时候,每次都从最上面的拿起(出栈),洗干净后又放回最上面(进栈)

Java的栈是怎么实现!

先看看stack的继承结构

栈继承vector类,vector类依此继承AvstractLIst、AbstractCollection(抽象集合类)实现Collection(集合)、Iterable(迭代器)接口。设计模式:适配器模式。

Java实现了栈(Stack类)的什么方法呢?

我们还是找一个方法看看,Java栈是怎么实现。那就push方法吧。

代码语言:javascript
复制
 java.util.Stack   
    public E push(E item) {
        addElement(item);

        return item;
    }
代码语言:javascript
复制
package java.util.Vector;
...
    public synchronized void addElement(E obj) {
        modCount++;
        ensureCapacityHelper(elementCount + 1);//数组下标处理(判断更新等)
        elementData[elementCount++] = obj; //数组
    }
    protected Object[] elementData;
    protected int elementCount;

我们通过一步步的阅读push方法的源码,我们发现Java中Stack的实际是通过数组实现的。关于数组的介绍:算法:数组和链表-理论

队列,Queue

队列在百度百科的介绍是:

队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。

我们也可以把队列想象成一条排队结账的队伍,先到的再前面,后面到的排在后面。

我们再考虑一下上面关于栈,一叠叠的碟子,每用一个碟子,依此从上到下,洗完再依此一个个叠好,这样是否合理。

其实,这样是不合理的,仔细想一下,最下面的碟子,那不是一直都用不到?一直不洗,一直不干净了。

其实,碟子的使用顺序更应该是队列,每次都是每次拿,从头到尾;每次放,从尾到头。

Java的队列是怎么实现!

先看看Queue的继承结构,Java中的Queue是一个接口,继承结构比较简单,向上继承Collection集合接口

我们可以看看它的实现类或者抽象类

我们通过ArrayBlockintQueue实现类,探究一下Java中的队列是怎么实现的。通过添加方法offer探究一下。

代码语言:javascript
复制
package java.util.concurrent.ArrayBlockingQueue;
   public boolean offer(E e) {
        checkNotNull(e);                        //检查是否为空
        final ReentrantLock lock = this.lock;   //可重用锁
        lock.lock();
        try {
            if (count == items.length)          //检查大小
                return false;
            else {
                enqueue(e);                      //实际添加方法
                return true;
            }
        } finally {
            lock.unlock();
        }
    }

    final Object[] items;

     private void enqueue(E x) {
        // assert lock.getHoldCount() == 1;
        // assert items[putIndex] == null;
        final Object[] items = this.items;
        items[putIndex] = x;                    //实际添加步骤
        if (++putIndex == items.length)
            putIndex = 0;
        count++;
        notEmpty.signal();
    }

好像没怎么明白过意思来,Queue接口,实现一些必要规则,实际的队列有很多种,那么实际的添加方法,存储的容器又根据类的特性进行设计。

我们再看看Queue的实现类LinkedList类。也是实现了Queue接口的。也看看offer接口。

代码语言:javascript
复制
package java.util.LinkedList;
...
public boolean offer(E e) {
        return add(e);
    }
public boolean add(E e) {
        linkLast(e);
        return true;
    }
void linkLast(E e) {                        //请查看链表文章
        final Node<E> l = last;
        final Node<E> newNode = new Node<>(l, e, null);
        last = newNode;
        if (l == null)
            first = newNode;
        else
            l.next = newNode;
        size++;
        modCount++;
    }

可以确定上面这个判断了,为了更方便的使用队列,设计一个Queue标准,再根据需要选用实现类。实际实现的方法各种各样。队列种的容器 有 数组的、链表的等等。

下面给一个数据结构时间复杂度和空间复杂度的表,这就不说咯。。

通用数据结构复杂度操作

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019/07/20 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 栈,stack
    • Java的栈是怎么实现!
    • 队列,Queue
      • Java的队列是怎么实现!
      • 通用数据结构复杂度操作
      相关产品与服务
      容器服务
      腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档