栈(Stack)

yizhihongxing

概述

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

空栈.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日

相关文章

  • python数据结构树和二叉树简介

    下面是关于“Python数据结构树和二叉树简介”的详细攻略。 一、树的概念 树(Tree)是一种非常重要的数据结构,它是由n(n>0)个有限节点组成一个具有层次关系的集合。其中一个节点被称作根节点,它没有父节点;除根节点外,其他节点都有且只有一个父节点;每个节点可以有0个或多个子节点。一棵树的深度为树中层次最大的节点层数,根节点层次为1。 二、二叉树的…

    数据结构 2023年5月17日
    00
  • C语言全面讲解顺序表使用操作

    C语言全面讲解顺序表使用操作 什么是顺序表 顺序表(Sequential List)是一种常见的数据结构,它由一组连续的存储单元组成,并且支持随机访问。通常我们使用数组来实现顺序表。 顺序表的基本操作 初始化 在使用顺序表之前,需要先进行初始化。顺序表的初始化包括两个步骤:指定顺序表的大小,申请内存空间。具体代码如下: #define MAXSIZE 100…

    数据结构 2023年5月17日
    00
  • C语言数据结构 双向链表的建立与基本操作

    C语言数据结构 双向链表的建立与基本操作 双向链表的定义 双向链表是一种常见的线性数据结构,它由多个结点组成,每个结点有两个指针,一个指向前一个结点,一个指向后一个结点。对于一个双向链表,我们可以获得其第一个结点和最后一个结点的指针,也可以沿着链表从前往后或从后往前遍历链表的每个结点。 双向链表的建立 我们首先需要定义一个双向链表的结点类型,包括两个指针,一…

    数据结构 2023年5月17日
    00
  • python实现朴素贝叶斯算法

    Python机器学习算法之朴素贝叶斯算法(Naive Bayes) 什么是朴素贝叶斯算法? 朴素贝叶算法是一种常见的分类算法,它的核心思想基于贝叶斯定理和特征条件独立假设,通过计算验概率来进行分类。在朴素贝叶斯算法中,我们通常使用极大似然估计来估计先验概率和条件概。 朴素贝叶斯算法的原理 朴素贝叶斯算法是一种基于贝叶斯定理的分类算法,它核心思想是通过计算后验…

    python 2023年5月13日
    00
  • python实现八大排序算法(1)

    下面是关于“Python实现八大排序算法(1)”的完整攻略。 1. 八大排序算法 排序算法是计算科学中最基本的算法之一,也是Python开发者必须掌握的算法之一。Python中常见的排序算法包冒泡排序、选择排序、插入排序、快速排序、归并排序、堆排序、计数排序和桶排序。下面将逐一介绍这些算法的实现方法。 1.1 冒泡排序 冒泡排序算法是一种简单的排序算法,它的…

    python 2023年5月13日
    00
  • python机器学习实现oneR算法(以鸢尾data为例)

    下面是详细讲解“Python机器学习实现oneR算法(以鸢尾data为例)”的完整攻略,包括算法原理、Python实现代码和两个示例说明。 算法原理 oneR算法是一种简单的分类算法,它通过统计每个特征的每个取值在不同类别中出现的频率,选择出现频率最高的特征和取值作为分类规则。具体来说,oneR算法的步骤如下: 对于每个特征统计每个取值在不同类别中出现的频率…

    python 2023年5月14日
    00
  • 详解回溯算法原理与使用方法

    回溯算法是一种经典的算法,用于在搜索和决策问题中寻找所有(或部分)的解。其实现过程主要是通过枚举所有可能的情况,判断其中符合条件的情况,找出解的过程。在此,我将根据经典的排列问题,详细讲解回溯算法的作用、基本思路以及使用方法。 一、回溯算法的作用 回溯算法主要解决那些求所有方案的问题,在这些问题中,需要枚举所有情况,并逐一判断是否符合要求,以求出所有方案的解…

    算法 2023年3月27日
    00
  • 用Python给图像算法做个简单应用界面

    下面是详细讲解“用Python给图像算法做个简单应用界面”的完整攻略,包含两个示例说明。 应用界面的作用 应用界面是一种非常有用的工具,可以帮助用户更方便地使用图像算法。应用界面可以提供以下功能: 显示图像 提供算法选项 显示算法结果 保存算法结果 应用界面可以使用户更轻松地使用图像算法,而不需要编写代码或使用命令行界面。 Python实现应用界面 Pyth…

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