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日

相关文章

  • 考研数据结构模板:顺序表、链表、栈、队列

    考研数据结构模板:顺序表、链表、栈、队列 前言 代码风格偏向于考研风格而非算法竞赛风格。 代码实现参考《2024数据结构王道复习指导》。 注释详细、保证看懂。 下面是已实现的数据结构模板: 顺序表SeqList 链表LinkList 双链表DLinkList 顺序栈SeqStack 循环顺序队列CircleQueue 链队列LinkQueue 顺序表SeqL…

    算法与数据结构 2023年4月17日
    00
  • Codeforces Round 871 (Div. 4)

    A.Love Story 题意: 给定n个长度为10的字符串,问其与codeforces字符串的对应下标字母不同的个数。 分析: 对于每个字符串从前往后依次和“codeforces”对应字符比较然后统计不同字母数即可 code: #include <bits/stdc++.h> using namespace std; int main() { …

    算法与数据结构 2023年5月8日
    00
  • C语言树状数组的实例详解

    首先需要了解什么是树状数组。树状数组(Binary Indexed Tree,BIT),也叫做 Fenwick 树(树状数组的发明者是Peter M. Fenwick),是一个查询和修改复杂度都为 log(n) 的数据结构,与线段树类似,但使用起来比线段树更加方便以及简洁。 在该攻略中,我们将通过两条树状数组的实例,详细讲解树状数组,让读者更好地理解树状数组…

    数据结构 2023年5月17日
    00
  • 一些常见的字符串匹配算法

    作者:京东零售 李文涛 一、简介 1.1 Background 字符串匹配在文本处理的广泛领域中是一个非常重要的主题。字符串匹配包括在文本中找到一个,或者更一般地说,所有字符串(通常来讲称其为模式)的出现。该模式表示为p=p[0..m-1];它的长度等于m。文本表示为t=t[0..n-1],它的长度等于n。两个字符串都建立在一个有限的字符集上。 一个比较常见…

    算法与数据结构 2023年4月25日
    00
  • go语言数据结构之前缀树Trie

    前缀树Trie 前缀树Trie是一种树形数据结构,被用于快速查找内存中的字符串数据。它非常适合存储大量的字符串,并且能够非常快速的查找以一个指定的字符串前缀开头的全部字符串。 相关术语 在学习前缀树Trie之前,需要掌握一下相关术语: 根节点:Trie树的根节点,代表空字符串。 边:连接两个节点的线,代表一个字符。 节点:表示一个字符串,可能是某个字符串的结…

    数据结构 2023年5月17日
    00
  • Java数据结构之队列(动力节点Java学院整理)

    Java数据结构之队列(动力节点Java学院整理) 队列是一种有序列表,在其中所有插入操作必须在后端进行,而所有的删除操作必须在前端进行的数据结构。这种结构有时被称为先进先出(FIFO)。 队列的分类 普通队列:队列和栈一样,都是只能在一端进行插入操作,在另一端进行删除操作的特殊线性表。队列的特点是:先进先出。适用于数据必须按照插入顺序处理的必要场合。 双端…

    数据结构 2023年5月17日
    00
  • C语言数据结构之栈简单操作

    C语言数据结构之栈简单操作 什么是栈? 栈(Stack)是一种线性数据结构,它具有“后进先出”(Last-In-First-Out)的特性。栈顶是栈的一端,另一端称为栈底。每次只能从栈顶插入数据(入栈)或者从栈顶取出数据(出栈)。 栈的简单操作 栈的简单操作包括: 初始化栈 判断栈是否为空 判断栈是否已满 入栈操作 出栈操作 获取栈顶元素 栈的初始化 栈的初…

    数据结构 2023年5月16日
    00
  • java实现队列数据结构代码详解

    Java实现队列数据结构代码详解 1. 队列数据结构简介 队列(Queue)是一种先进先出(FIFO)的数据结构,支持在一端插入元素,在另一端删除元素并返回删除的元素。其操作包括入队(enqueue)和出队(dequeue)。 2. 队列实现方法 队列可以通过数组或链表来实现。其中,数组实现的队列称为顺序队列,链表实现的队列称为链式队列。 2.1 顺序队列 …

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