栈(Stack)

概述

  • 栈就是一种 只允许在表尾进行插入和删除操作 的 线性表
  • 栈的特点
    • 先进后出 ,在表尾进行插入和删除操作

空栈.png
入栈.png
出栈.png

数组实现栈

  • crown
    • crown:使用bottom来确定栈顶所在数组的下标,默认为 -1
  • 空栈
    • 当空栈时 ,crown = -1
  • 栈是否为空
    • 当 crown = -1 时 ,栈为空 ,不能 遍历 ,出栈 , 获取栈顶元素
  • 栈是否已满
    • 当 crown = 数组.length - 1 时 ,栈已满 , 不能 入栈
  • 入栈
    • 栈未满,才能入栈
      • 先将 crown上移 ,再给数组下标为crown的元素赋值
    • 栈满 ,不能入栈
  • 出栈
    • 栈不为空 ,才能出栈
      • 将 crown往下移即可
    • 栈为空 ,不能出栈
  • 获取栈顶元素
    • 栈不为空 ,才能获取栈顶元素
      • 获得数组下标为crown的元素
    • 栈为空 ,不能出栈
  • 重置栈
    • 让crown = -1 即可
  • 打印栈
    • 遍历数组下标范围为 [ 0 , crown ] ,即可
public class ArrayStack {
    private int[] satck;
    private int size;
    private int crown = -1; // 栈顶
    public ArrayStack(int size){
        this.size = size;
        satck = new int[size];
    }
    //入栈操作
    public void push(int value){
        if (!isFull()){
            satck[++crown] = value;
        }
    }
    //出栈
    public void pop(){
        if (!isEmpty()){
            crown--;
        }
    }
    //判断是否为空
    public boolean isEmpty(){
        return crown == -1;
    }
    //判断栈是否已满
    public boolean isFull(){
       return crown == size-1;
    }
    //获取栈顶元素
    public int getTop(){
        if (!isEmpty()){
            return satck[crown];
        }
        return -1;
    }
    //重置栈
    public void  reset(){
        crown = -1;
    }
    //打印栈 , 从栈顶开始打印
    public void print(){
        int j = 0;
        for (int i = crown; i >= 0; i--) {
            System.out.println("第"+(++j)+"个元素为:" + satck[i]);
        }
    }
}

/**
 * @author 发着呆看星
 * @create 2023/4/18
 **/
public class ArrayStackTest {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        ArrayStack arrayStack = new ArrayStack(5);
        boolean p = true;
        while (p){
            System.out.println("==================栈的功能检测===================");
            System.out.println("1) 入栈");
            System.out.println("2) 出栈");
            System.out.println("3) 重置栈");
            System.out.println("4) 打印栈");
            System.out.println("5) 取出栈顶元素");
            System.out.println("6) 退出程序");
            System.out.print("请选择你需要的功能(1~~6):");
            int i = scanner.nextInt();
            int j;
            switch (i){
                case 1:
                    System.out.print("请选择你要入栈的数字:");
                    j = scanner.nextInt();
                    arrayStack.push(j);
                    break;
                case 2:
                    arrayStack.pop();
                    break;
                case 3:
                    arrayStack.reset();
                    break;
                case 4:
                    arrayStack.print();
                    break;
                case 5:
                    int top = arrayStack.getTop();
                    System.out.println("栈顶元素为:"+top);
                    break;
                case 6:
                    p = false;
                    break;
            }
        }
    }
}

链表实现栈

  • 实现思路
    • 入栈:将每一个入栈的元素添加为链表的首节点
    • 出栈:出栈则将链表的首节点进行删除
    • 由于链表可以无限长,所以不用担心栈满的问题
  • crown:代表栈顶元素的上一个元素 ,val属性默认为 -1 ,next 属性即为 栈顶元素
    • 当 next == null 时 ,代表空栈
  • 判断栈是否为空
    • 当crown.next == null 时 ,栈为空
  • 重置栈
    • 即将 crown的next属性置为null
  • 获取栈顶元素
    • 即获取链表首节点(获取crown的next属性所代表的节点)
  • 打印栈
    • 即遍历链表

链表空栈.png
链表入栈.png
链表出栈.png


/**
 * @author 发着呆看星
 * @create 2023/4/18
 **/
public class LinkedListStack {
    private ListNode crown = new ListNode(-1,null);
    // 判断是否为空
    public boolean isEmpty(){
        return crown.next == null;
    }
    // 入栈操作
    public void push(int value){
        ListNode temp = crown.next;
        crown.next = new ListNode(value, temp);
    }
    // 出栈操作
    public void pop(){
        if (!isEmpty()){
            crown.next = crown.next.next;
        }
    }
    // 取出栈顶元素
    public ListNode getTop(){
        return crown.next;
    }
    // 重置栈
    public void reset(){
        crown.next = null;
    }
    // 打印栈 ,从栈顶开始
    public void print(){
        ListNode temp = crown;
        int i = 0;
        while (temp.next != null){
            System.out.println("第"+(++i)+"个元素为:"+temp.next.val);
            temp = temp.next;
        }
    }
}
/**
 * @author 发着呆看星
 * @create 2023/4/18
 **/
public class LinkedListStackTest {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        LinkedListStack stack = new LinkedListStack();
        boolean p = true;
        while (p){
            System.out.println("==================栈的功能检测===================");
            System.out.println("1) 入栈");
            System.out.println("2) 出栈");
            System.out.println("3) 重置栈");
            System.out.println("4) 打印栈");
            System.out.println("5) 取出栈顶元素");
            System.out.println("6) 退出程序");
            System.out.print("请选择你需要的功能(1~~6):");
            int i = scanner.nextInt();
            int j;
            switch (i){
                case 1:
                    System.out.print("请选择你要入栈的数字:");
                    j = scanner.nextInt();
                    stack.push(j);
                    break;
                case 2:
                    stack.pop();
                    break;
                case 3:
                    stack.reset();
                    break;
                case 4:
                    stack.print();
                    break;
                case 5:
                    ListNode top = stack.getTop();
                    System.out.println("栈顶元素为:"+top);
                    break;
                case 6:
                    p = false;
                    break;
            }
        }
    }
}

原文链接:https://www.cnblogs.com/fzdkx/p/17332022.html

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:栈(Stack) - Python技术站

(0)
上一篇 2023年4月18日
下一篇 2023年4月19日

相关文章

  • 图解AVL树数据结构输入与输出及实现示例

    请允许我为您详细讲解“图解AVL树数据结构输入与输出及实现示例”的完整攻略。 标题 AVL树数据结构简介 AVL树是一种平衡二叉搜索树,是由G.M. Adelson-Velsky和E.M. Landis在1962年发明的。它的特点是带有平衡条件,任意节点的左右子树高度差不超过1,通过左旋、右旋、左右旋、右左旋四种形态的调整操作,来维护树的平衡。这样可以保证树…

    数据结构 2023年5月17日
    00
  • GPS北斗卫星时间同步系统助力电力自动化网络系统

    GPS北斗卫星时间同步系统助力电力自动化网络系统 GPS北斗卫星时间同步系统助力电力自动化网络系统 京准电子官微——ahjzsz 前言 近几年来,随着电力自动化水平的提高,在电力中计算机监控系统、微机保护装置、微机故障录波装置以及各类数据管理机得到了广泛的应用,而这些自动装置的配合工作需要有一个精确统一的时间。当电力系统发生故障时,既可实现全站各系统在统一时…

    算法与数据结构 2023年5月8日
    00
  • Java数据结构与算法之栈(动力节点Java学院整理)

    Java数据结构与算法之栈攻略 什么是栈? 栈是一种线性结构,属于“先进后出”(Last In First Out,LIFO)的数据结构。它只允许在栈顶进行插入和删除操作。 栈的实现 栈的实现有两种方式: 基于数组实现的顺序栈(ArrayStack) 基于链表实现的链式栈(LinkedStack) 1. 基于数组实现的顺序栈 顺序栈的实现需要一个固定大小的数…

    数据结构 2023年5月17日
    00
  • C语言数据结构之迷宫求解问题

    C语言数据结构之迷宫求解问题攻略 1. 前言 迷宫求解问题是计算机科学中一个经典的问题,也是许多初学者接触数据结构和算法时常用的题目。本文将通过C语言实现一个迷宫求解算法,介绍迷宫求解问题的基本思路和实现方法。 2. 迷宫求解问题的基本思路 迷宫求解问题的基本思路是利用深度优先搜索(DFS)或广度优先搜索(BFS)的算法去遍历整个迷宫,直到找到出口为止。在实…

    数据结构 2023年5月17日
    00
  • Python机器学习之决策树算法

    下面是关于“Python机器学习之决策树算法”的完整攻略。 1. 决策树算法的基本原理 决策树算法是一种基于树形结构的分类算法,它通过对数据集进行递归分割,生成一棵树形结构,用于对新数据进行分类。决策树算法的基本流程如下: 选择最优特征:根据某种评估指标,选择最优的特征作为当前节点的分裂特征。 分裂节点:根据分裂特征的取值,将当前节点分裂成多个子节点。 递归…

    python 2023年5月13日
    00
  • Python机器学习k-近邻算法(K Nearest Neighbor)实例详解

    下面是详细讲解“Python机器学习k-近邻算法(KNearestNeighbor)实例详解”的完整攻略,包括算法原理、Python实现和两个示例说明。 算法原理 k-近邻算法是一种基于实例的学习方法,其主要思想是通过计算样本之间的距离,找到与目标样本最近的k个样本,然后根据这k个样本的类进行分类。k-近邻算法的实现过程如下: 计算目标样本与训练样本之间的距…

    python 2023年5月14日
    00
  • Python数据结构与算法之图结构(Graph)实例分析

    下面是关于“Python数据结构与算法之图结构(Graph)实例分析”的完整攻略。 1. 图结构的基本概念 图结构是由节点和边组成的一种数据结构,它可以用来表示各种实体之间的关系。在图结构中,节点表示实体,边表示实体之间的关系。图结构可以分为有向图和无向图两种类型。在有向图中,边有方向,表示一个节点到另一个节点的单向关系;在无向图中,边没有方向,表示两个节点…

    python 2023年5月13日
    00
  • python的等深分箱实例

    以下是关于“Python的等深分箱实例”的完整攻略: 简介 等深分箱是一种常用的数据离散化方法,它将连续的数值型数据转换为离散的数据。在本教程中,我们将介绍等深分箱的基本概念,并使用Python实现等深分箱。 等深分箱基本概念 等深分箱是将数据分成相同数量的箱子,每个箱子包含相同数量的数据。等深分箱的基本步骤如下: 将数据按照大小排序。 将数据分成K个等分。…

    python 2023年5月14日
    00
合作推广
合作推广
分享本页
返回顶部