• 栈Stack和队列Queue


    栈Stack:FILO

    定义栈
               对栈的基本操作只有push进栈和pop出栈,栈的实现可以有数组实现的顺序栈和

               java提供的具体实现类Stack
                   public class Stack extends Vector
                           E push(E item) 
                           E pop() 弹出栈顶数据
                           E peek() 查看栈顶数据,并不会执行弹出操作 

                           int search(Object o) 查找o对象的下标值

    接口的定义 

    public interface Stack {
              //栈是否为空  记得在方法上添加注释
              boolean isEmpty();
              // data元素入栈
              void push(T data);
              //返回栈顶元素,未出栈
              T peek();
              //出栈,返回栈顶元素,同时从栈中移除该元素
              T pop();
    }

    实现类

    //顺序栈
    public class SeqStack implements Stack {
            // 栈顶指针,-1代表空栈
            private int top = -1;
            // 容量大小默认为10
            private static final int capacity = 10;
            // 存放元素的数组
            private T[] array;
            //当前栈中存储的元素个数
            private int size;
                    
            public SeqStack() {
                    this(capacity);
            }
                    
            @SuppressWarnings("unchecked")
            public SeqStack(int capacity) {
                    array = (T[]) new Object[capacity];
            }
                    
            public int size() {
                    return size;
            }
                    
            public boolean isEmpty() {
                    return this.top == -1;
            }
                    
            // 添加元素,从栈顶(数组尾部)插入
            public void push(T data) {
                    // 判断容量是否充足
                    if (array.length == size)
                            ensureCapacity(size * 2 + 1);// 扩容
                    // 从栈顶添加元素
                    array[++top] = data;
                    size++;
            }
                    
            private void ensureCapacity(int capacity) {
                    // 如果需要拓展的容量比现在数组的容量还小,则无需扩容
                    if (capacity < size)
                            return;
                    T[] old = array;
                    array = (T[]) new Object[capacity];
                    //for (int i=0; i                 //        array[i]=old[i];
                    System.arraycopy(old, 0, array, 0, size);
            }
                    
            // 获取栈顶元素的值,不删除
            public T peek() {
                    if (isEmpty())
                            throw new EmptyStackException();
                    return array[top];
            }
                    
            // 从栈顶(顺序表尾部)删除
            public T pop() {
                    if (isEmpty())
                            throw new EmptyStackException();
                    size--;
                    return array[top--];
            }
    }

    队列Queue:FIFO

    根据实现方式不同分为顺序队列和链式队列。
            enqueue(String item) 入队操作
            dequeue() 出队操作
                
            循环队列:基于数组的队列实现中,当tail=items.length时需要搬移大量的数据,就会导致
            入队操作的性能降低,可以使用循环队列解决
                
            典型算法:约瑟夫环
                
            队列接口 Queue
                
            public interface Queue extends Collection {
                    boolean add(E e);向队列中添加数据,阈值为64,Double size if small; else grow by 50%
                    boolean offer(E e);
                    E remove();  删除队列头部的数据
                    E poll();
                    E element();获取队列中的数据
                    E peek();
            }

    Deque 双向队列

    优先队列

    PriorityQueue是AbstractQueue的实现类,优先级队列的元素根据自然排序或者在构造函数时期提供Comparator来排序,具体根据构造器判断。PriorityQueue不允许null元素
            - 队列的头在某种意义上是指定顺序的最后一个元素。队列查找操作poll、remove、peek和element访问队列头部元素
            - 优先级队列是无限制的,但是具有内部capacity,用于控制在队列中存储元素的数组大小

            - 该类以及迭代器实现了Collection、Iterator接口的所有可选方法,这个迭代器提供了iterator()方法不能保证以任何特定顺序遍历优先级队列的元素。如果需要有序遍历使用Arrays.sort(queue.toArray())
            - 注意这个实现不是线程安全的,多线程不应该并发访问PriorityQueue实例,如果有某个线程修改了队列的话,使用线程安全的类PriorityBlockingQueue

            PriorityQueue是优先队列,作用是保证每次取出的元素都是队列中权值最小的,这里涉及到了大小关系,元素大小的评判可以通过元素自身的自然顺序(使用默认的比较器),也可以通过构造时传入的比较器。
            Java中PriorityQueue实现了Queue接口,不允许放入null元素;其通过堆实现,具体说是通过完全二叉树complete binary tree)实现的小顶堆(任意一个非叶子节点的权值,都不大于其左右子节点的权值),也就意味着可以通过数组来作为PriorityQueue的底层实现。

    1. import java.util.PriorityQueue;
    2. public class TestPriorityQueue {
    3. public static void main(String[] args) {
    4. PriorityQueue queue = new PriorityQueue<>();
    5. // PriorityQueue queue=new PriorityQueue<>((obj1,obj2)->{
    6. // return -1*obj1.getName().compareTo(obj2.getName());
    7. // });
    8. // queue.add(null);
    9. for (int i = 0; i < 10; i++) {
    10. A1 tmp = new A1(i + 0L, "name_" + (9 - i));
    11. queue.offer(tmp);
    12. }
    13. while(!queue.isEmpty())
    14. System.out.println(queue.poll());
    15. }
    16. }
    17. class A1 implements Comparable {
    18. private Long id;
    19. private String name;
    20. public A1(Long id, String name) {
    21. super();
    22. this.id = id;
    23. this.name = name;
    24. }
    25. public Long getId() {
    26. return id;
    27. }
    28. public void setId(Long id) {
    29. this.id = id;
    30. }
    31. public String getName() {
    32. return name;
    33. }
    34. public void setName(String name) {
    35. this.name = name;
    36. }
    37. @Override
    38. public String toString() {
    39. return "A1 [id=" + id + ", name=" + name + "]";
    40. }
    41. @Override
    42. public int compareTo(A1 o) {
    43. return this.name.compareTo(o.name);
    44. }
    45. }
  • 相关阅读:
    phpword生成PDF
    七、计算机视觉-图像的ROI区域
    mysql主从架构
    Linux基础知识与实操-篇二:初识Linux目录管理与操作
    软件测试--编写测试计划
    Spring 声明式事务控制
    2023年面试测试工程师一般问什么问题?
    【图灵MySQL】深入理解MVCC与BufferPoll缓存机制
    C#: 解释器模式(附完整源码)
    Spring Cloud项目(二)——集成Nacos作为配置中心
  • 原文地址:https://blog.csdn.net/tiger_root/article/details/126927842