📜  数据结构 |堆栈 |问题 6(1)

📅  最后修改于: 2023-12-03 15:10:19.728000             🧑  作者: Mango

数据结构 | 堆栈 | 问题 6

在编程中,堆栈(stack)是一种非常有用的数据结构,经常被用来解决各种问题。在本文中,我们将探讨堆栈的一些实际应用,并提供一些相关问题的解决方案。

堆栈的基本概念

堆栈是一种先进后出(Last In, First Out,LIFO)的数据结构,它允许在堆栈顶部进行插入和删除操作。具体来说,堆栈提供以下几种基本操作:

  • push: 将元素插入堆栈的顶部。
  • pop: 从堆栈的顶部移除元素。
  • peek: 返回堆栈顶部的元素,但不删除该元素。
  • isEmpty: 检查堆栈是否为空。
堆栈的应用
1. 进制转换

堆栈可以用于将一个数从一种进制转换为另一种进制。下面是一个将十进制数转换为二进制数的例子:

public static String decimalToBinary(int decimal) {
    Stack<Integer> stack = new Stack<Integer>();
    while (decimal > 0) {
        int digit = decimal % 2;
        stack.push(digit);
        decimal /= 2;
    }
    StringBuilder binary = new StringBuilder();
    while (!stack.isEmpty()) {
        binary.append(stack.pop());
    }
    return binary.toString();
}
2. 括号匹配

堆栈可以用于检查一个表达式中的括号是否匹配。下面是一个简单的实现:

public static boolean isBalanced(String expression) {
    Stack<Character> stack = new Stack<Character>();
    for (char c : expression.toCharArray()) {
        if (c == '(' || c == '[' || c == '{') {  // 如果是左括号,将其压入堆栈
            stack.push(c);
        } else if (c == ')' || c == ']' || c == '}') {  // 如果是右括号
            if (stack.isEmpty()) {
                return false;  // 如果堆栈为空,则括号不匹配
            }
            char left = stack.pop();  // 取出堆栈顶部的左括号
            if (!isMatchingPair(left, c)) {  // 如果左右括号不匹配,则括号不匹配
                return false;
            }
        }
    }
    return stack.isEmpty();  // 如果堆栈为空,则表达式中的括号全部匹配
}

public static boolean isMatchingPair(char left, char right) {
    return (left == '(' && right == ')') ||
           (left == '[' && right == ']') ||
           (left == '{' && right == '}');
}
3. 函数调用堆栈

在程序中,每当一个函数被调用时,系统都会为该函数创建一个新的堆栈帧(stack frame),帧中包含了函数的参数、局部变量和返回地址等信息。当函数执行完毕后,系统会将该堆栈帧从堆栈中弹出,恢复上一级函数的堆栈帧,继续执行上一级函数。

堆栈问题:括号匹配

给定一个字符串(只包含字符“(”、“)”、“{”、“}”、“[”和“]”),编写一个函数来确定该字符串的括号是否正确匹配。

如果括号正确匹配,则返回true,否则返回false。

下面是该问题的一个解决方案:

public static boolean isBalanced(String expression) {
    Stack<Character> stack = new Stack<Character>();
    for (char c : expression.toCharArray()) {
        if (c == '(' || c == '[' || c == '{') {  // 如果是左括号,将其压入堆栈
            stack.push(c);
        } else if (c == ')' || c == ']' || c == '}') {  // 如果是右括号
            if (stack.isEmpty()) {
                return false;  // 如果堆栈为空,则括号不匹配
            }
            char left = stack.pop();  // 取出堆栈顶部的左括号
            if (!isMatchingPair(left, c)) {  // 如果左右括号不匹配,则括号不匹配
                return false;
            }
        }
    }
    return stack.isEmpty();  // 如果堆栈为空,则表达式中的括号全部匹配
}

public static boolean isMatchingPair(char left, char right) {
    return (left == '(' && right == ')') ||
           (left == '[' && right == ']') ||
           (left == '{' && right == '}');
}
总结

堆栈是一种非常有用的数据结构,它通常用于解决许多实际问题。本文提供了一些堆栈的应用实例,并展示了如何使用堆栈来解决括号匹配问题。如果你还没有熟练掌握堆栈的基本概念和操作,请尝试自己实现一些例子,并且动手练习。