Java数据结构与算法之栈(Stack)实现详解

Java数据结构与算法之栈(Stack)实现详解

1. 栈的概念及用途

栈(Stack)是一种线性数据结构,它具有“后进先出(Last In First Out, LIFO)”的特点。栈可以看成是一种特殊的列表,列表中的元素只能通过栈顶加入或删除,称为入栈和出栈。

栈的应用非常广泛,例如在函数调用时,系统会自动为每个函数创建一个栈,用于存储函数调用过程中产生的临时数据,当函数返回时,系统会自动弹出栈顶元素,恢复上一层的函数调用。此外,栈还可以用于解决很多算法问题,例如表达式求值、括号匹配、图搜索等等。

2. 栈的实现

栈的实现方式有多种,例如使用数组和使用链表等。在本文中,我们将主要介绍使用数组实现栈的方法。

2.1 栈的定义

首先,我们需要定义一个栈类,表示一个栈对象。一个简单的栈类定义如下:

public class MyStack {
    private int[] stackArray; // 存储栈元素的数组
    private int top; // 栈顶指针

    // 构造方法,创建指定大小的栈
    public MyStack(int size) {
        stackArray = new int[size];
        top = -1;
    }

    // 将元素压入栈顶
    public void push(int element) {
        stackArray[++top] = element;
    }

    // 弹出栈顶元素
    public int pop() {
        return stackArray[top--];
    }

    // 判断栈是否为空
    public boolean isEmpty() {
        return top == -1;
    }

    // 获取栈大小
    public int size() {
        return top + 1;
    }

    // 获取栈顶元素
    public int peek() {
        return stackArray[top];
    }
}

以上代码定义了一个名为MyStack的栈类,包含了栈的主要操作,例如pushpopisEmptysizepeek等。在这个类中,我们使用一个整型数组stackArray来存储栈中的元素,使用一个整数top来表示栈顶的指针,初始值为-1。

2.2 栈的使用

接下来,我们来演示一下如何使用MyStack类。假设我们需要将一个整数数组中的元素反转,即将数组中的最后一个元素放到最前面,倒数第二个元素放到第二个位置,以此类推。我们可以使用栈来实现这个功能,代码如下:

public static void reverseArray(int[] array) {
    MyStack stack = new MyStack(array.length);
    // 将元素压入栈中
    for (int i = 0; i < array.length; i++) {
        stack.push(array[i]);
    }
    // 将栈中元素依次弹出,赋给原数组
    for (int i = 0; i < array.length; i++) {
        array[i] = stack.pop();
    }
}

以上代码定义了一个名为reverseArray的方法,该方法接受一个整数数组作为参数,然后使用MyStack类将数组中的元素倒序排列。在这个方法中,我们首先创建了一个MyStack对象,并将原数组的元素依次压入栈中。然后,我们再依次弹出栈中的元素,赋给原数组即可。

下面,我们再演示一个栈的应用,检查字符串中的括号是否匹配。如果匹配,返回true,否则返回false。

public static boolean checkBrackets(String str) {
    MyStack stack = new MyStack(str.length());
    // 遍历字符串中的字符
    for (int i = 0; i < str.length(); i++) {
        char c = str.charAt(i);
        switch (c) {
            case '(':
            case '[':
            case '{':
                // 将左括号压入栈中
                stack.push(c);
                break;
            case ')':
                // 如果栈顶元素是左圆括号,则弹出栈顶元素
                if (stack.peek() == '(') {
                    stack.pop();
                } else {
                    return false; // 括号不匹配
                }
                break;
            case ']':
                // 如果栈顶元素是左方括号,则弹出栈顶元素
                if (stack.peek() == '[') {
                    stack.pop();
                } else {
                    return false; // 括号不匹配
                }
                break;
            case '}':
                // 如果栈顶元素是左花括号,则弹出栈顶元素
                if (stack.peek() == '{') {
                    stack.pop();
                } else {
                    return false; // 括号不匹配
                }
                break;
        }
    }
    // 如果栈为空,则括号匹配
    return stack.isEmpty();
}

以上代码定义了一个名为checkBrackets的方法,该方法接受一个字符串作为参数,然后检查字符串中的括号是否匹配。在这个方法中,我们首先创建了一个MyStack对象,然后遍历字符串中的每个字符。如果当前字符是左括号,就将其压入栈中。如果当前字符是右括号,则与栈顶元素进行匹配,如果可以匹配就弹出栈顶元素,否则就返回false。如果遍历完整个字符串之后,栈为空,则说明括号匹配,返回true,否则返回false。

3. 总结

本文介绍了栈的基本概念和使用方法,实现了一个简单的栈类,并演示了栈的两个常见应用——数组反转和括号匹配。栈是一种简单而有用的数据结构,熟练掌握栈的使用方法对程序员来说非常重要。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java数据结构与算法之栈(Stack)实现详解 - Python技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • thinkPHP中_initialize方法实例分析

    思路:本文将详细介绍thinkPHP框架中_initialize方法的实例分析,包括_initialize方法所在的位置、_initialize方法的执行时机、_initialize方法的作用、_initialize方法的参数及使用方法等内容。并附带两个实例进行说明。 1. _initialize方法所在位置 _initialize方法位于thinkPHP框…

    other 2023年6月26日
    00
  • icloud内存大小怎么看? icloud内存使用情况查询教程

    iCloud内存大小怎么看? iCloud是苹果公司提供的云存储服务,用于存储和同步用户的数据。要查看iCloud的内存大小,可以按照以下步骤进行操作: 打开设置:在iOS设备上,点击主屏幕上的“设置”图标,进入设置界面。 选择你的Apple ID:在设置界面中,点击顶部显示的你的Apple ID,进入Apple ID设置页面。 进入iCloud设置:在Ap…

    other 2023年8月1日
    00
  • Win10系统自由设置时间对电脑进行重启的方法

    下面为您详细讲解Win10系统自由设置时间对电脑进行重启的方法。 步骤一:打开计划任务程序 点击桌面左下角的Windows菜单,然后输入“任务计划程序”并进入。 在左侧面板中点击“任务计划程序库”,然后在右侧面板中点击“新建任务”。 进行任务的基本设置,包括任务名称、是否要以管理员身份运行任务、是否可以在不同用户之间运行任务等等。其中管理员身份运行任务可以让…

    other 2023年6月27日
    00
  • 3dtouch

    3D Touch技术——引领智能设备新时代 随着技术的不断发展和智能设备的普及,我们的生活中越来越多地使用到了触摸屏幕的方法来操作设备。而3D Touch技术的出现,则为我们带来了更多的可能性和更加优秀的使用体验。 什么是3D Touch技术 3D Touch技术是由苹果公司在2015年推出的一种新型的触摸屏交互技术。该技术可以感知用户按压屏幕的力度,从而实…

    其他 2023年3月28日
    00
  • 关于opengl:使用glblitframebuffer显示纹理

    下面是关于“使用glBlitFramebuffer显示纹理”的完整攻略,包括步骤和示例说明。 简介 glBlitFramebuffer是OpenGL中的函数,用将一个帧缓冲区的内容复制到另一个帧缓冲区。它可以用于将一个帧缓冲区的内容显示到屏上,也可以于将一个帧缓冲区的内容复制到另一个帧缓冲区中。 步骤 下面是使用glBlitFramebuffer显示纹理的步…

    other 2023年5月8日
    00
  • C/C++中运算符的优先级、运算符的结合性详解

    C/C++中运算符的优先级、运算符的结合性详解 1. 运算符优先级 在C/C++中,不同的运算符具有不同的优先级。优先级高的运算符先于优先级低的运算符进行计算。下表列出了C/C++中常用运算符的优先级,优先级由高到低排列: 优先级 运算符 描述 1 () [] -> . 访问操作符 2 ++ — 后缀递增、递减 3 ++ — 前缀递增、递减 4 !…

    other 2023年6月28日
    00
  • Hello world!让 grub2 引导自己的操作系统 Xos 内核

    Hello world!让 grub2 引导自己的操作系统 Xos 内核 背景 在编写操作系统或内核的过程中,我们需要选择一个好的引导方式。grub2 是一个被广泛使用的引导程序,能够方便地引导多种操作系统,包括自己的操作系统。 步骤 准备工作 在开始之前,需要先安装 grub2 引导程序以及将编译好的 Xos 内核准备好。在 Ubuntu 上可以使用以下命…

    其他 2023年3月28日
    00
  • win7安装中升级安装和自定义安装有什么区别

    Win7的安装方式可以分为升级安装和自定义安装两种,它们之间主要的区别在于数据保留和安装文件的选择,下面我会详细讲解一下。 升级安装 升级安装指的是在原有的操作系统基础上进行更新和升级,数据、应用程序以及用户个性化设置会被保留下来,通常比较适用于针对系统版本升级。 升级安装的步骤如下: 运行Win7安装光盘或者USB,选择升级安装; 接下来会执行系统兼容性检…

    other 2023年6月25日
    00
合作推广
合作推广
分享本页
返回顶部