栈和队列(Stack和Queue)

目录

1. 栈(Stack)

1.1 概念

1.2 栈的使用  

 示例代码:

 1.3 栈的实现​编辑

2. 队列(Queue)

2.1 概念

2.2 队列的使用

2.3队列模拟实现

2.4 循环队列

3. 双端队列 (Deque)

1. 栈(Stack)

1.1 概念

        栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈 顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFOLast In First Out)的原则。

        压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶

        出栈:栈的删除操作叫做出栈。出数据在栈顶

                ​​​​​         ​​​​​        

                

1.2 栈的使用  

 示例代码:

public static void main(String[] args) {
    Stack<Integer> s = new Stack();
    s.push(1);
    s.push(2);
    s.push(3);
    s.push(4);
    System.out.println(s.size()); // 获取栈中有效元素个数---> 4
    System.out.println(s.peek()); // 获取栈顶元素---> 4
    s.pop(); // 4出栈,栈中剩余1 2 3,栈顶元素为3
    System.out.println(s.pop()); // 3出栈,栈中剩余1 2 栈顶元素为3
    if(s.empty()){
        System.out.println("栈空");
    }else{
        System.out.println(s.size());
    }
}

                         

 1.3 栈的实现

        从上图中可以看到,Stack 继承了VectorVectorArrayList类似,都是动态的顺序表,不同的是Vector是线程安 全的。

 

2. 队列(Queue)

2.1 概念

        队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出FIFO(First In First Out)。

        入队列:进行插入操作的一端称为队尾(Tail/Rear)。

        出队列:进行删除操作的一端称为队头 Head/Front)。

 

2.2 队列的使用

Java 中, Queue 是个接口,底层是通过链表实现 的。
                                        

 注意:Queue是个接口,在实例化时必须实例化LinkedList的对象,因为LinkedList实现了Queue接口。

 示例代码:

public static void main(String[] args) {
Queue<Integer> q = new LinkedList<>();
    q.offer(1);
    q.offer(2);
    q.offer(3);
    q.offer(4);
    q.offer(5); // 从队尾入队列
System.out.println(q.size());
System.out.println(q.peek()); // 获取队头元素
    q.poll();
System.out.println(q.poll()); // 从队头出队列,并将删除的元素返回
    if(q.isEmpty()){
        System.out.println("队列空");
    }else{
    System.out.println(q.size());
}
}

2.3队列模拟实现

          队列中既然可以存储元素,那底层肯定要有能够保存元素的空间,通过前面线性表的学习了解到常见的空间类型有 两种:顺序结构 和 链式结构。
        

2.4 循环队列

        实际中我们有时还会使用一种队列叫循环队列。如操作系统课程讲解生产者消费者模型时可以就会使用循环队列。
        环形队列通常使用数组实现。

                         

3. 双端队列 (Deque)

        双端队列(deque 是指允许两端都可以进行入队和出队操作的队列, deque “double ended queue” 的简称。 那就说明元素可以从队头出队和入队,也可以从队尾出队和入队。

         Deque是一个接口,使用时必须创建LinkedList的对象

 在实际工程中,使用Deque接口是比较多的,栈和队列均可以使用该接口。


Deque<Integer> stack = new ArrayDeque<>();//双端队列的线性实现
Deque<Integer> queue = new LinkedList<>();//双端队列的链式实现

猜你喜欢

转载自blog.csdn.net/qq_61576108/article/details/134374683