线性结构之栈和队列

上一篇线性结构之数组和链表

1. 栈和队列

栈: 先进后出(FILO - first in last out):最先插入的元素最后出来。
队列:先进先出(FIFO - first in first out):最先插入的元素最先出来。

图示:

2. 栈和队列在java中的实现

在java中栈是用Stack实现的,Stack继承自Vector;也可以使用LinkedList,ArrayDeque

实现栈功能先进后出操作

使用java中的集合类,实现栈的操作

使用Stack来实现栈的操作

        Stack<String> stringStack = new Stack<>();
        stringStack.push("aaa");
        stringStack.push("bbb");
        String s = stringStack.pop();

使用LinkedList来实现栈的操作

        LinkedList<String> stringStack = new LinkedList<>();
        //选择下面一套不要混用
        //第1套组合
        stringStack.push("aaa");
        stringStack.push("bbb");
        String s1 = stringStack.pop();

        //第2套组合
        stringStack.addFirst("aaa");
        stringStack.addFirst("bbb");
        String s2 = stringStack.removeFirst();

        //第3套组合
        stringStack.addLast("aaa");
        stringStack.addLast("bbb");
        String s3 = stringStack.removeLast();

        //还有其他组合,LinkedList继承Deque,实现了从头或者尾添加和移除元素
栈的运用场景
  • 反转操作,如链表的反转,字符串的反转
  • 树基于栈的先序、中序、后序遍历

实现队列功能先进先出操作

使用LinkedList来实现队列的操作

        LinkedList<String> stringLinkedList = new LinkedList<>();
        stringLinkedList.add("aaa");
        stringLinkedList.add("bbb");
        String s = stringLinkedList.poll();
        //还有其他组合,LinkedList继承Deque,实现了从头或者尾添加和移除元素

优先对列(堆)

堆的概念

堆(英语:heap)是计算机科学中一类特殊的数据结构的统称。堆通常是一个可以被看做一棵树的数组对象。堆总是满足下列性质:

  • 堆中某个节点的值总是不大于或不小于其父节点的值;
  • 堆总是一棵完全二叉树。

将根节点最大的堆叫做最大堆或大根堆,根节点最小的堆叫做最小堆或小根堆。

java中PriorityQueue(堆)的使用
  • 使用根节点性质:最小堆根节点永远是最小的;反之,最大堆根节点永远是最大的。这样在一个PriorityQueue队列中取出根节点的数据就是最大或者最小的,有优先级的。
//默认排序是最小堆
        PriorityQueue<Integer> integerPriorityQueue = new PriorityQueue<>();
        integerPriorityQueue.add(2);
        integerPriorityQueue.add(-1);
        integerPriorityQueue.add(3);
        integerPriorityQueue.add(1);
        integerPriorityQueue.add(5);
        while (integerPriorityQueue.size() > 0) {
            Integer integer = integerPriorityQueue.poll();
            Log.e(TAG, "integer-->" + integer.toString());
        }
//自定义排序,使用下面的
    public PriorityQueue(Comparator<? super E> comparator) {
        this(DEFAULT_INITIAL_CAPACITY, comparator);
    }
  • k 个元素的最大堆,根节点是第k小的;k个元素的最小堆,根节点是第k大的,使用这个性质,解决这类问题,在未排序的数组中找到第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。

示例 1:
输入: [3,2,1,5,6,4] 和 k = 2
输出: 5
示例 2:
输入: [3,2,3,1,2,4,5,5,6] 和 k = 4
输出: 4

//优先队列
public static int findKthLargest(int nums[], int k) {
    PriorityQueue<Integer> heap = new PriorityQueue<>();
    for (int num : nums){
        if (heap.size()<k){
            heap.add(num);
        }else if (heap.peek() < num){
            heap.poll();
            heap.add(num);
        }
    }
    return heap.poll();
}

可以查看其他不适用堆的实现方法:https://blog.csdn.net/weixin_48157178/article/details/107445355

java中ArrayDeque,LinkedList的使用

ArrayDeque使用数组实现的Deque双端队列,实现了从头或者尾添加和移除元素,可以用来实现栈和队列操作

LinkedList是使用链表实现的Deque双端队列,实现了从头或者尾添加和移除元素,可以用来实现栈和队列操作

上一篇线性结构之数组和链表


此文要是对你有帮助,如果方便麻烦点个赞,谢谢!!!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值