[数据结构】栈和队列

目录

1.栈

1.1概念

[1.2 栈的使用](#1.2 栈的使用)

1.3.栈的模拟实现

2.队列

2.1概念

2.2队列的使用

2.3队列的模拟实现

[2.4 循环队列](#2.4 循环队列)

2.5双端队列


1.栈

1.1概念

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

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

出栈:栈的删除操作叫做出栈。出数据在栈顶
有点类似于步枪压子弹一样,先压进去的最后在发射,最后压进去的先发射。先进后出。

1.2 栈的使用

|-----------------|------------|
| 方法 | 功能 |
| Stack() | 构造一个空的栈 |
| E push(E e) | 将e入栈,并返回e |
| E pop() | 将栈顶元素出栈并返回 |
| E peek() | 获取栈顶元素 |
| int size() | 获取栈中有效元素个数 |
| boolean empty() | 检测栈是否为空 |

1.3.栈的模拟实现

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

我们使用数组来模拟实现一个栈

java 复制代码
public class MyStack<E> {
    int[] array;
    int size;
    public  MyStack(){
        array=new int[3];
    }
    //压栈
    public int push(int val){
        array[size] = val;
        size++;
        return val;
    }
    //弹出栈顶元素
    public int pop(){
       int temp= peek();
       size--;
       return temp;

    }
    //查看栈顶元素
    public int peek(){
        if(empty()){
            return -1;
        }
        return array[size-1];

    }
    public boolean  empty(){
        return size==0;
    }
    //遍历
    public void display(){
        for (int i = 0; i < size; i++) {
            System.out.print(array[i]+ " ");
        }
    }
    //获取栈中元素个数
    public int size(){
        return size;
    }

}

2.队列

2.1概念

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

2.2队列的使用

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

|--------------------|-------------|
| 方法 | 功能 |
| boolean offer(E e) | 入队列 |
| E poll() | 出队列 |
| peek() | 获取队头元素 |
| int size() | 获取队列中有效元素个数 |
| boolean isEmpty() | 检测队列是否为空 |

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

2.3队列的模拟实现

我们使用单向链表来模拟实现一个队列

首先我们思考一个问题,插入的操作很容易,但是当我们想弹出队尾元素的时候,因为是基于链表的,所以我们得知道它的前一个节点,这样才好把它给获取并删掉,如果我们采取尾插法,自然是做不到的,所以我们采取头插法。

java 复制代码
public class MyQueue {
    class Node{
        private int val;
        private Node next;
        public Node(int val){
            this.val=val;
        }
    }
    private Node head;
    private Node last;
    private int size;
    public void offer(int data){
        Node node = new Node(data);
        if(head==null){
            head = node;
            last = node;
            size++;
        }else {
            last.next=node;
            last=node;
        }
    }
    public  int poll(){
        if(!isEmpty()){
            int tmp=head.val;
            head=head.next;
            return tmp;
        }
        return -1;
    }
    public boolean isEmpty(){
        return last==null;
    }
    public int peek(){
        if(!isEmpty()){
            return head.val;
        }
        return -1;
    }
}

2.4 循环队列

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

2.5双端队列

双端队列(deque)是指允许两端都可以进行入队和出队操作的队列,deque 是 "double ended queue" 的简称。

那就说明元素可以从队头出队和入队,也可以从队尾出队和入队

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

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

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

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

相关推荐
考虑考虑3 小时前
Jpa使用union all
java·spring boot·后端
用户3721574261354 小时前
Java 实现 Excel 与 TXT 文本高效互转
java
浮游本尊5 小时前
Java学习第22天 - 云原生与容器化
java
渣哥6 小时前
原来 Java 里线程安全集合有这么多种
java
间彧7 小时前
Spring Boot集成Spring Security完整指南
java
间彧7 小时前
Spring Secutiy基本原理及工作流程
java
Java水解8 小时前
JAVA经典面试题附答案(持续更新版)
java·后端·面试
洛小豆10 小时前
在Java中,Integer.parseInt和Integer.valueOf有什么区别
java·后端·面试
前端小张同学10 小时前
服务器上如何搭建jenkins 服务CI/CD😎😎
java·后端
ytadpole11 小时前
Spring Cloud Gateway:一次不规范 URL 引发的路由转发404问题排查
java·后端