当前位置: 首页 > news >正文

数据结构(JAVA)栈

1. 栈

栈是一种特殊的线性表,只允许在一端进行插入和删除元素操作。他的操作顺序是先进后出

栈顶:进行插入和删除元素操作的一端。

栈顶:不进行任何操作。

压栈:栈的插入操作。

出栈:栈的删除操作。

2. 栈的模拟实现

栈可以使用顺序表来实现,也可以使用链表来实现。

2.1 用顺序表实现的栈

2.1.1 栈的接口

public class MyStack {
    public int[] elem;
    public int usedSize;
    //构造方法
    public MyStack() {}
    //入栈
    public void push(int val) {}
    //出栈
    public int pop() {}
    //获取栈顶元素,但不删除
    public int peek() {}
    //判满
    private boolean isFull() {}
    //判空
    public boolean isEmpty() {}
}

2.1.2 栈的成员变量

用数组来表示栈,usedSize来表示栈中元素个数。

public int[] elem;
public int usedSize;

2.1.3 栈的构造方法

在构造方法中我们先开劈10个int空间。

    public MyStack() {
        this.elem = new int[10];
    }

2.1.4 入栈

思路:

        1. 首先判断数组是否已满,已满进行扩容。

        2. 进行元素插入,再usedSize++;

    public void push(int val) {
        if(isFull()) {
            this.elem = Arrays.copyOf(elem,2*elem.length);
        }
        elem[usedSize++] = val;
    }

2.1.5 出栈

思路:

        1. 首先判断数组是否为空,为空异常。

        2. 再usedSize-- ,并返回usedSize下标的元素。 

public int pop() {
    if(isEmpty()) {
       throw new StackEmptyException();
    }
    usedSize--;
    return elem[usedSize];
}

2.1.6 获取栈顶元素,但不删除

思路:

        1. 判断判断数组是否为空,为空异常。

        2. 返回 usedSize-1下标的元素。

    public int peek() {
        if(isEmpty()) {
            throw new StackEmptyException();
        }
        return elem[usedSize-1];
    }

2.1.7 判满

判断数组 的长度是否等于usedSize。

    private boolean isFull() {
        return this.elem.length == usedSize;
    }

2.1.8 判空

判断usedSize是否等于零。

    public boolean isEmpty() {
        return usedSize == 0;
    }

2.2 用链表实现栈

由于栈的先入后出的特性,如果我们使用单向链表,那么要拿到最后节点,它的时间复杂度为O(n),所以使用双向链表。

2.2.1 栈的接口

public class MyStack {
   static class ListNode {
      public ListNode next;
      public ListNode prev;
      public int val;

      public ListNode(int val) {
        this.val = val;
      }
    }
    public ListNode first;
    public ListNode last;
    //入栈
    public void push(int val) {}
    //出栈
    public int pop() {}
    //获取栈顶元素,但不删除
    public int peek() {}
    //判空
    public boolean isEmpty() {}
}

2.2.2 内部类

和双向连表差不多。

    static class ListNode {
        public ListNode next;
        public ListNode prev;
        public int val;

        public ListNode(int val) {
            this.val = val;
        }
    }

2.2.3 入栈

思路:

        1. 判断栈是否为空,为空头结点,尾结点同时指向node结点。

        2. 否则就进行尾插。

    public void push(int val) {
        ListNode node = new ListNode(val);
        if(isEmpty()) {
            first = last = node;
        }
        last.next = node;
        node.prev = last;
        last = node;
    }

2.2.4 出栈

思路:

       1. 判断栈是否为空,为空直接抛异常。

       2. 否则把尾结点删除。

       3. 最后返回删除之前尾结点的数值。 

    public int pop() {
        if(isEmpty()) {
            throw new StackEmptyException();
        }
        int val = last.val;
        last.prev.next = null;
        last = last.prev;
        return val;
    }

2.2.5 获取栈顶元素,但不删除

思路:

        1. 判断栈是否为空,为空直接抛异常。

        2. 返回尾结点的数值。

    public int peek() {
        if(isEmpty()) {
            throw new StackEmptyException();
        }
        int val = last.val;
        return val;
    }

2.2.6 判空

判断头节点是否为空。

    public boolean isEmpty() {
        return first == null;
    }

3. JAVA中的栈

Stack继承了Vector,Vector和ArrayList类似,都是动态的顺序表。

实现了Serializable接口,可序列化

实现了Cloneable 接口,可克隆

实现了RandomAccess接口,可随机访问

3.1  栈的方法

     

http://www.dtcms.com/a/113024.html

相关文章:

  • Nacos 服务发现的核心模型有哪些?Service, Instance, Cluster 之间的关系是什么?
  • 基于Transformer框架实现微调后Qwen/DeepSeek模型的流式推理并封装成接口
  • 获取inode的完整路径包含挂载的路径
  • 蓝桥杯 完全平方数 刷题笔记
  • 优化 Web 性能:管理第三方资源(Third-Party Summary)
  • 数字内容体验A/B测试优化实战
  • 本地命令行启动服务并连接MySQL8
  • NLP/大模型八股专栏结构解析
  • [特殊字符] Pandas 常用操作对比:Python 运算符 vs Pandas 函数
  • JuiceFS设计框架剖析
  • 【C/C++】编译与链接过程详解
  • 最小生成树理论
  • ROM/FLASH/RAM
  • LeetCode刷题常见的Java排序
  • 安卓开发工程师-布局设计
  • 【深度学习】嘿马深度学习目标检测教程第1篇:商品目标检测要求、目标,1.1 项目演示【附代码文档】
  • 前端判断值相等的方法和区别
  • I.MX6ULL 交叉编译环境配置与使用
  • 纯免费的零基础建站教程
  • Android使用OpenGL和MediaCodec录制
  • JDK8卸载与安装教程(超详细)
  • 122.买卖股票的最佳时机 II
  • Day2:前端项目uniapp壁纸实战
  • #SVA语法滴水穿石# (013)关于内建系统函数
  • Git三剑客:工作区、暂存区、版本库深度解析
  • 王者荣耀的游戏匹配机制
  • 《UNIX网络编程卷1:套接字联网API》第6章 IO复用:select和poll函数
  • 《算法笔记》9.8小节——图算法专题->哈夫曼树 问题 C: 哈夫曼树
  • Java中与、|与||的区别详
  • 算法刷题记录——LeetCode篇(3.9) [第281~290题](持续更新)