数据结构与算法(Java)--栈(Linked_Stack)

news2024/9/24 11:32:52
  • 博客主页:誓则盟约
  • 系列专栏:Java SE
  • 关注博主,后期持续更新系列文章
  • 如果有错误感谢请大家批评指出,及时修改
  • 感谢大家点赞👍收藏⭐评论✍ 

线性表:栈

栈的定义

        栈(Stack)是一种特殊的线性表,它只允许在一端进行插入(称为入栈,Push)和删除(称为出栈,Pop)操作。这一端被称为栈顶(Top),另一端则被称为栈底(Bottom)。

基本概念

  1. 先进后出(FILO - First In Last Out)原则:就像一个堆满物品的桶,先放入的物品被压在底部,后放入的物品在顶部。只有先取出顶部的物品,才能逐步取出底部先放入的物品。比如往一个桶里依次放入篮球 1、篮球 2、篮球 3,要取出时,只能先取出篮球 3,然后是篮球 2,最后是篮球 1。如下图所示:

  2. 栈顶和栈底:栈顶是进行操作的一端,栈底则是相对固定的一端。栈顶元素是当前可以操作的元素。

  3. 空栈:当栈中没有任何元素时,称为空栈。

  4. 栈的长度:栈中元素的个数。

  5. 顺序栈和链式栈:顺序栈是使用数组来实现的栈,链式栈则是使用链表来实现的栈。今天讲解的是链式栈

        在实际应用中,栈的这种特殊结构使得它在很多场景中发挥着重要作用,比如函数调用、表达式求值、回溯算法等。

栈的操作

1.入栈(Push)操作

入栈操作是将一个元素添加到栈顶的过程。

        在顺序栈中,首先需要检查栈是否已满。如果未满,将新元素放在栈顶指针所指的位置,然后将栈顶指针向上移动一位。

        例如,假设我们有一个容量为 5 的顺序栈,当前栈中的元素为 10、20、30,栈顶指针指向位置 3。现在要将元素 40 入栈,操作如下:

  1. 检查栈未满,当前还有空间。
  2. 将 40 存储在位置 3 。
  3. 栈顶指针加 1,指向位置 4 。

        在链式栈中,入栈操作相对简单。创建一个新的节点,将新元素存储在该节点中,然后让新节点的指针指向当前的栈顶节点,更新栈顶指针使其指向新节点。

以下是用 Java 语言实现链式栈入栈操作的示例代码:

import org.w3c.dom.Node;

import java.util.NoSuchElementException;
public class Linked_Stack<E> { // 链表实现
private final Node<E> head = new Node<E>(null);
    private static class Node<E>{
    private  E e;
    private Node<E> next;
          public Node(E e) {
              this.e = e;
          }
      }
public void push(E e) {
    Node <E> node = new Node <> (e);
    node.next = head.next;
    head.next = node;
}}

        入栈操作是栈的基本操作之一,它为后续的出栈、栈的遍历和其他相关操作提供了基础。 

2.出栈(Pop)操作

出栈操作是从栈顶删除一个元素的过程。

        在顺序栈中,首先需要检查栈是否为空。如果不为空,取出栈顶元素,然后将栈顶指针向下移动一位。

        例如,有一个顺序栈,其中的元素为 50、60、70,栈顶指针指向位置 2 。进行出栈操作时:

  1. 检查栈不为空。
  2. 取出位置 2 的元素 70 。
  3. 栈顶指针减 1,指向位置 1 。

        在链式栈中,出栈操作是先检查栈是否为空。若不为空,取出栈顶节点的数据,更新栈顶指针使其指向下一个节点,然后释放原栈顶节点的内存。

以下是用 Java 语言实现链式栈出栈操作的示例代码:

public E pop() {
    if (isEmpty()) throw new NoSuchElementException("栈为空");
    E e = head.next.e;
    head.next = head.next.next;
    return e;
}

        出栈操作与入栈操作相辅相成,共同构成了栈的基本功能,常用于解决各种需要后进先出逻辑的问题,比如撤销操作、表达式计算等。

3.判空(is_Empty)操作

判空操作用于判断栈是否为空。

        在顺序栈中,通常通过检查栈顶指针的值来判断。如果栈顶指针为 -1(假设初始时栈顶指针为 -1 ),则栈为空。

        例如,一个顺序栈,其栈顶指针为 -1 ,表示此时栈中没有任何元素,即栈为空。

        在链式栈中,判空操作则是检查栈顶指针是否为 NULL 。如果为 NULL ,则栈为空。

        比如,一个链式栈的栈顶指针为 NULL ,意味着没有任何节点存在于栈中,栈处于空的状态。

以下是用 Java 语言实现链式栈判空操作的示例代码:

public boolean isEmpty(){
    return head.next == null;
      }

4.读取栈顶元素(Peek)

  • 此操作用于获取栈顶元素的值,但不会将其从栈中删除。
  • 例如,在一个栈中存储着 10、20、30 ,通过 Peek 操作可以获取到 30 ,但栈中的元素不变。

以下是用 Java 实现读取栈顶元素(Peek)操作的示例代码:

    public E peek() {
        if (head.next == null) {
            throw new NoSuchElementException("empty stack");
        }
        return head.next.e;
    }

5.清空栈(Clear)操作

  • 将栈中的所有元素删除,使栈回到初始的空状态。
    public void clear() {
        Node current = head.next;
        while (current!= null) {
            Node temp = current;
            current = current.next;
            temp.next = null;
            temp = null;
        }
        head.next = null;
    }

        通过遍历链表,依次释放每个节点的内存,这样可以确保链表栈中的所有节点都被正确释放,实现了真正的清空操作。

6.获取栈的长度(GetLength)操作

  • 返回栈中当前元素的个数。

以下是一个使用链表实现的栈的 GetLength 方法的 Java 示例代码:

    public int getLength() {
        int length = 0;
        Node<E> current = head.next;
        while (current!= null) {
            length++;
            current = current.next;
        }
        return length;
    }

完整链式栈代码:

import org.w3c.dom.Node;
import java.util.NoSuchElementException;
public class Linked_Stack<E> { // 链表实现
private  Node<E> head = new Node<E>(null);
public void push(E e) {
    Node <E> node = new Node <> (e);
    node.next = head.next;
    head.next = node;
}
public E pop() {
    if (isEmpty()) throw new NoSuchElementException("栈为空");
    E e = head.next.e;
    head.next = head.next.next;
    return e;
}
public boolean isEmpty(){
    return head.next == null;
      }
      private static class Node<E>{
    private  E e;
    private Node<E> next;
          public Node(E e) {
              this.e = e;
          }
      }
    public void clear() {
        Node current = head.next;
        while (current!= null) {
            Node temp = current;
            current = current.next;
            temp.next = null;
            temp = null;
        }
        head.next = null;
    }
    public E peek() {
        if (head.next == null) {
            throw new NoSuchElementException("empty stack");
        }
        return head.next.e;
    }
    public int getLength() {
        int length = 0;
        Node<E> current = head.next;
        while (current!= null) {
            length++;
            current = current.next;
        }
        return length;
    }
}

代码测试:

    public static void main(String[] args) {
    Linked_Stack<String> st = new Linked_Stack<>();
    st.push("A");
    st.push("B");
    st.push("C");
    st.push("D");
    st.clear();
    st.push("Q");
    System.out.println(st.peek());
    System.out.println(st.getLength());
    while(!st.isEmpty()){
        System.out.println(st.pop());
    }
        System.out.println(st.getLength());
      }
/*输出:

Q
1
Q
0

进程已结束,退出代码为 0
*/

 “人能够能动地认识世界;人能够能动地改造世界。”——《主观能动性》

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1971627.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

谷歌开源最强端侧小模型:2B参数越级跑赢GPT-3.5-Turbo,苹果15Pro运行飞快

谷歌也来卷「小」模型了&#xff0c;一出手就是王炸&#xff0c;胜过了比自己参数多得多的GPT-3.5、Mixtral竞品模型。 点击访问我的技术博客https://ai.weoknow.comhttps://ai.weoknow.com 今年 6 月底&#xff0c;谷歌开源了 9B、27B 版 Gemma 2 模型系列&#xff0c;并且自亮…

嵌入式C++、MQTT、React、Spring Boot和MongoDB:物联网工厂检测系统设计思路(代码示例)

项目概述 随着工业4.0和物联网&#xff08;IoT&#xff09;技术的发展&#xff0c;越来越多的工厂借助智能化手段进行生产数据的采集和实时监控。本项目设计并实现一个物联网工厂检测系统&#xff0c;通过传感器采集关键参数&#xff0c;并利用云平台进行数据存储和分析&#…

Python 教程(九):内置模块与第三方模块

目录 专栏列表前言1. 模块基础目录结构示例模块 mymodule.py 2. 导入模块3. 从模块中导入特定内容3.1 from … import *总结&#xff1a; 4. 包示例包结构moduleone.pymoduletwo.py__init__.py导入包 5. 模块搜索路径6. 内置模块示例 7. 第三方库8. __name__ 属性9. 初始化和清…

开源小项目-基于STM32F103的频率测量实现 V1.1(ADC+TIM+DMA+FFT)

目录 一、快速傅里叶变换&#xff08;FFT&#xff09; 1.1 工作原理 1.2 应用 1.3 FFT官方支持库 二、使用外设简介 2.1 ADC外设 2.2 TIM外设 3.3 DMA外设 三、代码设计过程 3.1 初始化 3.2 DMA中断数据处理 3.3 其他自定义函数 1. 计算信号频率 2. 计算信号幅度…

G-EVAL: NLG Evaluation using GPT-4 with Better Human Alignment

文章目录 题目摘要方法实验分析相关工作结论 题目 G-EVAL:使用GPT-4进行NLG评估&#xff0c;具有更好的人类一致 论文地址&#xff1a;https://arxiv.org/abs/2303.16634 项目地址&#xff1a;https://github.com/nlpyang/geval 摘要 自然语言生成(NLG)系统生成的文本质量难以…

网站开发涉及到的技术内容介绍——前端

一、网站开发涉及前后端交互模式 一般来说网站项目分为两种【前后端不分离、前后端分离】,其中前后端不分离的项目是(后端语言可以直接与前端的html等内容糅合在一起,后端语言可以操作数据进行动态渲染前端的html文件进行展示)。后端分离的项目是(后端语言不会直接对前端的…

c++| c++11左右值引用,完美转发,可变参数模板

c| c11的新特性 左&#xff0c;右值引用什么是左值&#xff0c;右值左值引用和右值引用右值引用解决什么问题呢&#xff1f;移动构造万能引用形式 完美转发格式 lambada表达式格式 可变参数模板可变参数模板实现打印不同类型emplace_push以list的emplace_back的实现举例 左&…

掌握 HTTP 请求的艺术:理解 cURL GET 语法

在 Web 开发和服务器通信领域&#xff0c;掌握 HTTP 请求对于寻求有效与 Web 服务和 API 交互的开发人员至关重要。在众多可用于发出 HTTP 请求的工具中&#xff0c;cURL 脱颖而出&#xff0c;成为全球开发人员信赖的强大且多功能的命令行工具。在这篇博文中&#xff0c;我们将…

MySQL分组查询有关知识总结

目录 4. 分组查询&#xff08;group by&#xff09; 4.1 概述 4.2 分组函数 4.2.1 单个使用 4.2.2 组合使用 4.2.3 注意&#xff01; 4.3 group by 4.3.1 单个字段 4.3.2 多个字段 4.3.3 提醒&#xff01; 4.4 having 4.5 分组查询演示 4. 分组查询&#xff08;…

海外仓怎么入局?货代还有发展的空间吗?

很多货代小伙伴可能都有一个疑惑&#xff1a;海外仓虽然火爆&#xff0c;但是怎么入局呢&#xff1f;显然&#xff0c;自建海外仓的试错代价太高了&#xff0c;成本高、选址难、管理起来更是一地鸡毛。既然无法自建&#xff0c;那转换赛道&#xff0c;管理别人的仓库&#xff0…

iOS面试之属性关键字(二):常见面试题

Q:ARC下&#xff0c;不显式指定任何属性关键字时&#xff0c;默认的关键字都有哪些&#xff1f; 对应基本数据类型默认关键字是:atomic,readwrite,assign 对于普通的 Objective-C 对象:atomic,readwrite,strong Q&#xff1a;atomic 修饰的属性是怎么样保存线程安全的&#x…

如何将本地下载的切片电影进行合成一个视频

合成后的时长1&#xff1a;41 没有合成前是50个电影切片 注明:电影切片不是真实的切片名称而是自定义从0-50的数字 import requests # with open("电影.m3u8","r") as f: # n0 # for line in f: # if line.startswith("#"): …

SpringBoot项目如何安装Selenium自动化(详解)

目录 一、打开intellij idea&#xff0c;创建Maven项目 二、添加依赖 三、在Test路径下创建自动化文件 3.1 项目结构 3.2 代码 四、运行自动化 前言&#xff1a; java版本最低要求为8。电脑至少已安装一种浏览器&#xff0c;如&#xff1a;Chrome&#xff08;推荐&#xff09;、…

十日Python项目——第五日(商品数据)

#前言&#xff1a; 在最近十天我会用Python做一个购物类项目&#xff0c;会用到DjangoMysqlRedisVue等。 今天是第五天&#xff0c;主要负责撰写响应具体的商品数据。若是有不懂大家可以先阅读我的前四篇博客以能够顺承。 若是大家基础有不懂的&#xff0c;小编前面已经关于…

RJ45空包弹网口描述与应用

RJ45空包弹网口&#xff0c;通常指的是RJ45接口的空芯线缆&#xff08;通常称为“空包”&#xff09;和相应的连接器。这种线缆和连接器组合常用于网络布线中&#xff0c;特别是在需要将网络信号从一端传输到另一端&#xff0c;同时保持信号完整性和隔离性的场合。 描述&#…

C++初阶:list的使用和模拟实现

关于list可以先看一下这个文档&#xff1a;list文档 一.list的介绍和使用 1.1 list的介绍 list实际上就是链表&#xff0c;是带头双向循环链表。 1.2 list的使用 list的使用跟我们以前用C语言实现时的一样。push&#xff0c;pop&#xff0c;insert等等。 1.2.1list的构造 …

【从零开始一步步学习VSOA开发】开发环境搭建

开发环境搭建 开发 VSOA 首先需要搭建开发环境&#xff0c;这里讲解 Windows 下 C/C 开发环境搭建方法。 下载 IDE 并申请授权码 SylixOS 的开发和部署需要 RealEvo-IDE 的支持&#xff0c;因此您需要先获取 RealEvo-IDE 的安装包和注册码。 RealEvo-IDE 分为体验版和商业版…

简单的 微服务netflix 学习

简单的 微服务netflix 学习 一.Eureka 学习 1. 服务简单搭建 1.1 首先确定pom文件 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-…

FPGA入门系列:计数器

目录 微信公众号获取更多FPGA相关源码&#xff0c;且微信公众号为首发&#xff0c;第一时间获取最新文章&#xff1a; 计数器是一种典型的时序器件&#xff0c;常用于对时钟脉冲的个数进行计数&#xff0c;还用于定时、分频、产生同步脉冲等 按触发方式分&#xff1a;同步计数…

国内SSL证书颁发机构哪家服务更优质?

SSL证书作为保障网站数据传输安全的关键工具&#xff0c;其重要性不言而喻。选择一个可靠的SSL证书代理商&#xff0c;不仅能够提供多样化的证书类型&#xff0c;而且能在众多品牌中进行比较&#xff0c;选择最适合自己的、性价比更高的产品。此外&#xff0c;优质的代理商还能…