首页 > 其他分享 >【基本数据结构】栈

【基本数据结构】栈

时间:2023-03-01 23:23:42浏览次数:48  
标签:基本 Node top private 括号 数据结构 public size

一、后进先出(LIFO)

栈是一种操作受限的线性表,只允许在一端插入和删除数据,这一端叫做栈顶,对应的另一端叫做栈底。向栈中添加元素也叫进栈、入栈、压栈,从栈中删除元素也叫出栈、退栈、弹栈。

适用场景:当某个数据集合只涉及在一端插入和删除数据,并且满足后进先出、先进后出的特性,就应该首选栈。

 

二、栈的实现

栈可以用数组来实现,叫做顺序栈,也可以用链表来实现,叫做链式栈。

栈支持的操作:

  • 入栈(push)
  • 出栈(pop)
  • 栈空(isEmpty)
  • 栈满(isFull)
  • 元素数量(size)

 

2.1 数组实现(顺序栈)

/**
 * 顺序栈
 *
 * @author Luwei
 * @since 2023-03-01 22:05:48
 */
public class ArrayStack<T> {
    private Object[] items;
    private int capacity;
    private int size;
    
    /**
     * 构造方法
     *
     * @param capacity 栈初始容量
     */
    public ArrayStack(int capacity) {
        this.capacity = capacity;
        size = 0;
        items = new Object[capacity];
    }
    
    /**
     * 默认构造方法,默认初始容量为 10
     */
    public ArrayStack() {
        this(10);
    }
    
    /**
     * 入栈,栈满会扩容为原来的 2 倍大小
     *
     * @param element 入栈元素
     * @return 入栈是否成功
     */
    public boolean push(T element) {
        if (size == capacity) { // 栈满,扩容为原来的2倍
            capacity <<= 1;
            items = Arrays.copyOf(items, capacity);
        }
        items[size] = element;
        size++;
        return true;
    }
    
    /**
     * 出栈
     *
     * @return 栈顶元素,栈空返回 null
     */
    public T pop() {
        if (size == 0) { // 栈空
            return null;
        }
        size--;
        return (T) items[size];
    }
}

 

2.2 链表实现(链式栈)

/**
 * 链式栈
 *
 * @author Luwei
 * @since 2023-03-01 22:34:03
 */
public class LinkedStack<T> {
    private Node<T> top;
    private int size;
    
    /**
     * 构造方法,使用带头双向链表
     */
    public LinkedStack() {
        size = 0;
        top = new Node<>(null, null, null);
    }
    
    /**
     * 入栈
     *
     * @param element 入栈元素
     * @return 入栈是否成功
     */
    public boolean push(T element) {
        Node<T> newNode = new Node<>(top, element, null);
        top.next = newNode;
        top = newNode;
        size++;
        return true;
    }
    
    /**
     * 出栈
     *
     * @return 栈顶元素,栈空返回 null
     */
    public T pop() {
        if (size == 0) { // 栈空
            return null;
        }
        Node<T> tmp = top;
        top = top.prev;
        top.next = null;
        size--;
        return tmp.item;
    }
    
    private static class Node<T> {
        private Node<T> prev;
        private T item;
        private Node<T> next;
        
        public Node(Node<T> prev, T item, Node<T> next) {
            this.prev = prev;
            this.item = item;
            this.next = next;
        }
    }
}

 

三、栈的应用

3.1 括号匹配

假设表达式中只包含三种括号,圆括号 ()、方括号[]和花括号{},并且它们可以任意嵌套,但必须成对出现。比如,{[] ()[{}]}或[{()}([])]为合法格式,而{[}()]或[({)]为不合法的格式。现在有一个包含三种括号的表达式字符串,如何检查它是否合法呢?

用栈解决。从左到右依次遍历字符,用栈保存未匹配的左括号。当遇到到左括号时,将其压入栈中;当遇到右括号时,从栈顶取出一个左括号,如果能够匹配,比如“(”跟“)”匹配,“[”跟“]”匹配,“{”跟“}”匹配,则继续扫描剩下的字符串,如果扫描过程中,遇到不能配对的右括号,或者栈中没有数据,为非法格式。当所有的括号都扫描完成之后,如果栈为空,说明字符串格式合法;否则,说明有未匹配的左括号,为非法格式。

 

标签:基本,Node,top,private,括号,数据结构,public,size
From: https://www.cnblogs.com/luwei0424/p/17170075.html

相关文章

  • 【数据库原理及应用MySQL】第一章 数据系统的基本原理
    第一章        数据库系统的基本原理1.1.1数据库系统的应用不做详细介绍 1.1.2数据库系统的概念数据(data):是客观事物的符号标识,是可以被计算机识别,存储和加......
  • DRF的安装和基本增删查改的简单使用
    1.app注册   2.建表 3.创建ser.py(重点) 4.views.py代码(重点)  5.路由配置(重点) 6.项目启动后的网址效果---17.项目启动后的网址效果---发送GET请求......
  • StringBuilder类基本使用方法
    八股StringBuilder与StringBuffer的公共父类是AbstractStringBuilder,提供了很多操作修改字符串的方法。StringBuilder非线程安全,StringBuffer使用synchronized给方法加......
  • 全数字OQPSK调制解调的基本算法,包括成形滤波器、NCO模型、载波恢复
    1.算法描述        OQPSK调制技术是一种恒包络调制技术,受系统非线性影响小,具有较高的带宽利用率和功率利用率,在卫星环境、无线环境下得到广泛应用。因此,在通信信......
  • git介绍及基本使用
    一、版本控制器完成协同开发项目,帮助程序员整合代码帮助开发者合并开发的代码,使用git实现版本的控制如果出现冲突代码的合并,会提示后提交合并代码的开发者,让其解决冲突......
  • CPU L1,L2,L3多级缓存的基本作用
    基本作用加快CPU与主内存之间的数据交换。区别缓存类型L1L2L3位置最靠近CPU核心次之再次之容量一般几十KB~几百KB几百KB~几MB几MB~几十MB速度......
  • linux基本功之date命令实战
    前言在日常工作中,我们经常会用到date命令来判断任务执行的时间,或者使用date命令去实现时间段内的工作任务,今天我们一起来探讨下date命令一、date简介date英[deɪt]日期,时......
  • vue前端实现将页面显示内容生成pdf文件的几种方法,html2canvas、dom-to-image、jspdf(带
    实际开发需求:vue项目中,根据数据结构生成echarts图表组件,生成带有样式的图表以后,点击下载按钮,把图表以pdf格式的文件下载到本地实现思路:将vue界面的echarts组件生成图片,然......
  • WSL 2 基本命令
    安装WSL2查看可同时在线安装的Linux发行版名称wsl-l-o#或wsl--list--online安装WSL2命令wsl--install#此选项必需,以下选项按需选择--no-distri......
  • 网络通信基本概念
    通信人与人、人与物、物与物之间通过某种媒介和行为进行信息传递与交流网络通信指终端设备之间通过计算机网络进行的通信数据通信网络由路由器、交换机、防火墙、无线......