Java数据结构与算法之栈(动力节点Java学院整理)

Java数据结构与算法之栈攻略

什么是栈?

栈是一种线性结构,属于“先进后出”(Last In First Out,LIFO)的数据结构。它只允许在栈顶进行插入和删除操作。

栈的实现

栈的实现有两种方式:

  1. 基于数组实现的顺序栈(ArrayStack)
  2. 基于链表实现的链式栈(LinkedStack)

1. 基于数组实现的顺序栈

顺序栈的实现需要一个固定大小的数组用于存储数据,同时需要指向栈顶的指针。

public class ArrayStack {
    private int[] data;
    private int top;

    public ArrayStack(int size) {
        this.data = new int[size];
        this.top = -1;
    }

    public boolean push(int num) {
        if (top == data.length - 1) {
            return false;
        }
        data[++top] = num;
        return true;
    }

    public int pop() {
        if (top == -1) {
            return -1;
        }
        return data[top--];
    }
}

2. 基于链表实现的链式栈

链式栈的实现需要一个单向链表,同时需要一个指向栈顶的指针。

public class LinkedNode {
    public int val;
    public LinkedNode next;

    public LinkedNode(int val) {
        this.val = val;
    }
}

public class LinkedStack {
    private LinkedNode top;

    public LinkedStack() {
        this.top = null;
    }

    public boolean push(int num) {
        LinkedNode node = new LinkedNode(num);
        node.next = top;
        top = node;
        return true;
    }

    public int pop() {
        if (top == null) {
            return -1;
        }
        int val = top.val;
        top = top.next;
        return val;
    }
}

栈的应用

栈的应用十分广泛,包括常见的函数调用、表达式求值等。下面分别说明。

函数调用

在计算机程序中,每个函数都有它自己的栈帧(Stack Frame),栈帧包括了函数的参数、局部变量、返回地址等。当一个函数被调用时,它的栈帧就被压入栈中,当函数返回时,这个栈帧就被弹出。这一过程严格按照“先进后出”的原则执行,保证了函数调用的正确性。

表达式求值

表达式求值可以用栈来实现。算法步骤如下:

  1. 从左到右扫描表达式。
  2. 遇到数字时,直接入栈。
  3. 遇到运算符时,弹出栈顶两个元素进行计算,并将结果入栈。
  4. 最终,栈中只有一个元素,即表达式的值。

例如,对于表达式“3+4*5-6”,其求值过程如下:

元素 操作
3 入栈
4 入栈
5 入栈
* 弹出2个元素(5、4),计算4*5=20,并将20入栈
+ 弹出2个元素(20、3),计算3+20=23,并将23入栈
6 入栈
- 弹出2个元素(6、23),计算23-6=17,并将17入栈

最终,栈中只有一个元素17,即表达式“3+4*5-6”的值为17。

示例

1. 判断括号是否匹配

下面是判断括号是否匹配的示例代码:

public boolean isMatch(String str) {
    Stack<Character> stack = new Stack<>();
    for (int i = 0; i < str.length(); i++) {
        char ch = str.charAt(i);
        if (ch == '(') {
            stack.push(ch);
        } else if (ch == ')') {
            if (stack.isEmpty()) {
                return false;
            }
            stack.pop();
        }
    }
    return stack.isEmpty();
}

2. 中缀表达式转后缀表达式

下面是将中缀表达式转化为后缀表达式的示例代码:

public String infixToPostfix(String str) {
    StringBuilder sb = new StringBuilder();
    Stack<Character> stack = new Stack<>();
    for (int i = 0; i < str.length(); i++) {
        char ch = str.charAt(i);
        if (ch >= '0' && ch <= '9') {
            sb.append(ch);
        } else if (ch == '+' || ch == '-') {
            while (!stack.isEmpty() && stack.peek() != '(') {
                sb.append(stack.pop());
            }
            stack.push(ch);
        } else if (ch == '*' || ch == '/') {
            while (!stack.isEmpty() && (stack.peek() == '*' || stack.peek() == '/')) {
                sb.append(stack.pop());
            }
            stack.push(ch);
        } else if (ch == '(') {
            stack.push(ch);
        } else if (ch == ')') {
            while (stack.peek() != '(') {
                sb.append(stack.pop());
            }
            stack.pop();
        }
    }
    while (!stack.isEmpty()) {
        sb.append(stack.pop());
    }
    return sb.toString();
}

总结

本文介绍了栈的相关内容,包括栈的定义、实现、应用以及示例代码。栈在实际开发中非常常用,希望读者能够掌握本文介绍的内容,提高自己的编程能力。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java数据结构与算法之栈(动力节点Java学院整理) - Python技术站

(0)
上一篇 2023年5月17日
下一篇 2023年5月17日

相关文章

  • Java链表数据结构及其简单使用方法解析

    Java链表数据结构及其简单使用方法解析 概述 链表是一种非线性结构,由一系列节点按照顺序连接而成。每个节点由数据域和指针域组成,数据域用于存储数据,指针域用于指向下一个节点或者上一个节点。在Java中,链表有多种实现方式,常见的有单向链表、双向链表等。 单向链表的实现 以下是一个单向链表的实现代码示例: public class Node { privat…

    数据结构 2023年5月17日
    00
  • C语言数据结构实现字符串分割的实例

    C语言中数据结构实现字符串分割可以用到两种常见数据结构:指针和数组。 方法一:指针 步骤一:创建指针 首先声明一个指针类型的变量,用来存储字符串中单个字符所在的地址: char *ptr; 步骤二:遍历字符串 通过对字符串进行遍历,在每个分隔符位置上获取单词,并通过指针记录下每个单词的地址: char str[] = "C语言-数据结构-字符串分割…

    数据结构 2023年5月17日
    00
  • C语言数据结构 链表与归并排序实例详解

    C语言数据结构 链表与归并排序实例详解 链表介绍 链表是一种数据结构,它对于存储数据是动态而灵活的。它可以根据我们的需要动态的分配内存空间。链表是由先后相连的数据单元(结点)组成,每个结点都包含了下一结点的地址信息,最后一个结点的地址信息为NULL。链表按照操作方式可以分为单向链表、双向链表与循环链表等几种类型。 归并排序原理 归并排序是一种分治思想的算法,…

    数据结构 2023年5月16日
    00
  • Java数据结构之单链表的实现与面试题汇总

    Java数据结构之单链表的实现与面试题汇总 一、前言 单链表是数据结构中最基础的数据结构之一,也是在面试时经常会考察的一个知识点。本文将详细介绍单链表的实现过程,并对常见的单链表面试题进行总结,帮助大家深入了解单链表的原理和应用。 二、单链表的实现 单链表是由一些列节点构成的,每个节点包括一个数据和一个指向下一个节点的指针。下面我们将实现一个简单的单链表,并…

    数据结构 2023年5月17日
    00
  • C语言学习之链表的实现详解

    下面我将详细讲解“C语言学习之链表的实现详解”的完整攻略。 1. 链表的定义 链表是一种数据结构,它由一系列节点组成。每个节点由一个数据部分和一个指向下一个节点的地址部分组成。链表可以有多种形式,例如单向链表、双向链表、循环链表等。 2. 链表的实现 2.1. 单向链表 单向链表是最简单的链表形式,一个节点只包含一个指向下一个节点的指针。在C语言中,我们可以…

    数据结构 2023年5月17日
    00
  • JavaScript数据结构常见面试问题整理

    JavaScript数据结构常见面试问题整理 介绍 JavaScript是一种广泛使用的脚本语言,用于在Web上创建动态效果,验证表单,增强用户体验等。它是一种高级语言,使用许多数据结构来存储和处理数据。在面试中,考官通常会问一些与JavaScript数据结构相关的问题,这篇文章将整理一些常见的面试问题和他们的解答,以便帮助你做好准备。 常见问题 1. 什么…

    数据结构 2023年5月17日
    00
  • C语言数据结构中定位函数Index的使用方法

    C语言的数据结构中,定位函数Index的使用方法主要涉及到数组和指针的相关操作。Index函数的作用是在数组中查找对应的元素,返回该元素的索引位置。以下是详细攻略: 一、Index函数的用法 Index函数的原型如下: void *index(const void *s, int c, size_t n); 其中,参数含义如下: s: 要查找的数组 c: 要…

    数据结构 2023年5月17日
    00
  • 数据结构与算法中二叉树子结构的详解

    数据结构与算法中二叉树子结构的详解 什么是二叉树子结构 二叉树是一种数据结构,由包含根节点的节点组成,可以拓展为左子树和右子树。二叉树子结构指的是,在一棵二叉树中,具有连续节点的子树。 如何判断是否为二叉树子结构 对于一棵二叉树T和另外一棵二叉树S,我们可以判断S是否为T的子树,遵循以下判断原则: 如果树S为空,则表示S不是T的子树; 如果树S的根节点和树T…

    数据结构 2023年5月17日
    00
合作推广
合作推广
分享本页
返回顶部