数据结构与算法栈的详解_数据结构怎么判断出栈的顺序

数据结构与算法栈的详解_数据结构怎么判断出栈的顺序一、什么是栈栈(stack)是一种先进后出的有序列表,其中的元素只能在线性表的同一端进出,允许元素插入和删除的一端被称为栈顶(top),固定的另一端被称为栈底(button)。二、数组简单实现栈

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

一、什么是栈

栈(stack)是一种先进后出的有序列表,其中的元素只能在线性表的同一端进出

允许元素插入和删除的一端被称为栈顶(top),固定的另一端被称为栈底(button)。

数据结构与算法栈的详解_数据结构怎么判断出栈的顺序

二、数组简单实现栈

由于栈是只在一端进出,也就是说相比队列实际上只需要有一个栈顶指针top即可:

  1. 当栈空时top为-1
  2. 入栈后top+1
  3. 出栈后top-1

根据思路我们可以用数组实现一个简单的栈:

/**
 * @Author:huang
 * @Date:2020-06-23 16:51
 * @Description:使用数组模拟栈
 */
public class Stack {

    private int maxSize;
    private int top = -1;
    private Object[] arr;

    public Stack(int maxSize) {
        this.maxSize = maxSize;
        this.arr = new Object[maxSize];
    }

    /**
     * 判断栈满
     * @return
     */
    public boolean isFull() {
        return top == maxSize - 1;
    }

    /**
     * 判断栈空
     * @return
     */
    public boolean isEmpty() {
        return top == -1;
    }

    /**
     * 入栈
     * @param item
     */
    public void push(Object item) {
        //判断栈是否已满
        if (isFull()) {
            throw new RuntimeException("栈已满");
        }
        //入栈
        top = top + 1;
        arr[top] = item;
    }

    /**
     * 出栈
     */
    public Object pop() {
        if (isEmpty()) {
            throw new RuntimeException("栈为空!");
        }
        Object item = arr[top];
        top--;
        return item;
    }

    /**
     * 遍历栈
     */
    public void show() {
        if (isEmpty()) {
            throw new RuntimeException("栈为空!");
        }
        //遍历并打印栈中元素
        for (int i = top; i >= 0; i--) {
            System.out.println("stack" + i + ":" + arr[i]);
        }
    }
}

三、链表简单模拟栈

数组可以比较简单的实现一个栈,但是缺点的数组随着元素的增加会需要扩容,如果初始化申请的存储空间太大,会造成空间的浪费,如果申请的存储空间太小,后期会经常需要扩充存储空间,为此我们可以用链表实现的栈来避免这个问题。

假设现有头结点,一号元素A,我们需要往里面插入或弹出B,,由于要实现“先进后出”的效果:

  1. 入栈时,B需要插入头结点和A之间,取代A的位置:
    • B.next = head.next,也就是B指向A
    • head.next = B.next,也就是让头结点指向B
  2. 出栈时,B需要从头结点和A之间移除:
    • head.next = A,也就是让头结点直接指向A即可

数据结构与算法栈的详解_数据结构怎么判断出栈的顺序

按照这个思路,我们先写一个节点类:

/**
 * @Author:huang
 * @Date:2020-06-20 10:19
 * @Description:节点类
 */
public class Node {

    //数据
    Object data;

    //下一个节点
    Node next;

    public Node(Object data) {
        this.data = data;
    }
}

然后简单实现一个链表栈:

/**
 * @Author:huang
 * @Date:2020-06-23 21:30
 * @Description:链表栈
 */
public class LinkListStack {

    private Node head = new Node("我是头结点");

    /**
     * 判断是否空栈
     * @return
     */
    public boolean isEmpty() {
        return head.next == null;
    }

    /**
     * 添加节点到链表
     * @param item 要插入的元素
     */
    public void push(Object item) {
        Node node = new Node(item);
        Node temp = head;
        //如果空栈就直接插入
        if (isEmpty()) {
            temp.next = node;
            return;
        }

        //不是空栈就插到头结点头面
        node.next = temp.next;
        temp.next = node;
    }

    /**
     * 将元素出栈
     * @return 出栈元素
     */
    public Object pop() {
        if (isEmpty()) {
            throw new RuntimeException("栈为空!");
        }
        Node node = head.next;
        head.next = node.next;
        return node.data;
    }

    /**
     * 遍历栈
     */
    public void show() {
        if (isEmpty()) {
            throw new RuntimeException("栈为空!");
        }
        Node temp = head.next;
        while (true) {
            if (temp == null) {
                break;
            }
            System.out.println(temp.data);
            temp = temp.next;
        }
    }
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/170816.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 常见电容器图片_电容分类图片-各种电容器图片[通俗易懂]

    常见电容器图片_电容分类图片-各种电容器图片[通俗易懂]《电容分类图片-各种电容器图片》由会员分享,可在线阅读,更多相关《电容分类图片-各种电容器图片(7页珍藏版)》请在人人文库网上搜索。1、电容分类图片-各种电容器图片第1幅图1胆电容。图2灯具电容器。图3MKPH电容。图4MET电容。图5,10PEI电容,图6,胆贴片电容。图7MPE电容。图8贴片电容。图11轴向电解电容器。图12MPP电容第2幅图1PPN电容。图2PET电容…

    2022年8月22日
    3
  • Linux学习(CentOS-7)—磁盘分区(概念、分区方法、分区方案)

    Linux学习(CentOS-7)—磁盘分区(概念、分区方法、分区方案)

    2021年9月23日
    134
  • EasyMock PowerMock 的简单使用(with spring Autowired)

    EasyMock PowerMock 的简单使用(with spring Autowired)

    2021年5月9日
    134
  • 动态规划应用–最长递增子序列 LeetCode 300[通俗易懂]

    动态规划应用–最长递增子序列 LeetCode 300[通俗易懂]文章目录1.问题描述2.解题思路2.1回溯法求解2.2动态规划1.问题描述有一个数字序列包含n个不同的数字,如何求出这个序列中的最长递增子序列长度?比如2,9,3,6,5,1,7这样一组数字序列,它的最长递增子序列就是2,3,5,7,所以最长递增子序列的长度是4。2.解题思路2.1回溯法求解/***@description:最长递增子序列*@author:m…

    2022年5月5日
    30
  • 11asdsad「建议收藏」

    11asdsad「建议收藏」常用Linux命令修改目录,文件权限的命令如何获取一个本地服务器上可用的端口。说说常见的linux命令,linux查看内存的命令是什么?查看系统磁盘空间剩余情况的命令如何获取java进程的pid如何获取某个进程的网络端口号;如何实时打印日志如何统计某个字符串行数;用一行命令查看文件的最后五行。用一行命令输出正在运行的java进程。绝对路径,当前目录、上层目录,切换目录分别用什么命令?怎么清屏?怎么退出当前命令?目录创建,创建文件,复制文件分别用什么命令?查看文件内容有哪些命令

    2022年4月29日
    34
  • 群晖docker mysql_Watchtower – 群晖自动更新 Docker 映像与容器

    群晖docker mysql_Watchtower – 群晖自动更新 Docker 映像与容器群晖的Docker功能非常丰富,不过也有不完美的地方,映像和容器更新比较麻烦,比如我的Docker容器运行了十几个,如果通过手动更新非常繁琐,容器还需要重新配置本文就介绍如何通过watchtower全自动更新Docker映像,并保留原始配置重新运行容器。watchtower是一个可以监控正在运行的容器镜像是否有更新的工具,当本地镜像与远端镜像有差异的时候,可以自动使用当前容器的运行参数以新镜像重…

    2025年6月13日
    1

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号