数据结构与算法-栈

  • 定义
    栈是GetItem、ListInsert、ListDelete操作限制只能发生在表尾的线性表。
    在这里插入图片描述
  • 术语
    表头 - 栈底,表尾 - 栈顶,插入 - 压栈,删除 - 出栈
  • 特点
    先进后出(Last In First Out)
    栈是线性表的特例,插入的位置是length+1,删除的位置的是length,一般也只读取第length数据元素。

在这里插入图片描述

栈的应用

括号匹配

https://leetcode.com/problems/valid-parentheses/description/

Description

Given a string containing just the characters ‘(’, ‘)’, ‘{’, ‘}’, ‘[’ and ‘]’, determine if the input string is valid.

  • An input string is valid if:
  1. Open brackets must be closed by the same type of brackets.
  2. Open brackets must be closed in the correct order.

Note that an empty string is also considered valid.

  • Example 1
    Input: “()”
    Output: true
  • Example 2
    Input: “()[]{}” – Output: true
  • Example 3
    Input: “(]” – Output: false
  • Example 4
    Input: “([)]” – Output: false
  • Example 5
    Input: “{[]}” – Output: true
堆栈实现

时间复杂度O(n),空间复杂度O(n)

  • 思路
  1. 从左到右扫描字符串,取出第一个字符C,如果是左括号就压栈;如果是右括号就出栈;否则不匹配,停止。
  2. 重复1直到字符串为空。
  3. 如果栈不为空则不匹配。
    class Solution {
        // Hash table that takes care of the mappings.
        private HashMap<Character, Character> mappings;
        // Initialize hash map with mappings. This simply makes the code easier to read.
        public Solution() {
            this.mappings = new HashMap<Character, Character>();
            this.mappings.put(')', '(');
            this.mappings.put('}', '{');
            this.mappings.put(']', '[');
        }

        public boolean isValid(String s) {
            // Initialize a stack to be used in the algorithm.
            Stack<Character> stack = new Stack<Character>();
            for (int i = 0; i < s.length(); i++) {
                char c = s.charAt(i);
                // If the current character is a closing bracket.
                if (this.mappings.containsKey(c)) {
                    // Get the top element of the stack. If the stack is empty, set a dummy value of '#'
                    char topElement = stack.empty() ? '#' : stack.pop();
                    // If the mapping for this bracket doesn't match the stack's top element, return false.
                    if (topElement != this.mappings.get(c)) {
                        return false;
                    }
                } else {
                    // If it was an opening bracket, push to the stack.
                    stack.push(c);
                }
            }
            // If the stack still contains elements, then it is an invalid expression.
            return stack.isEmpty();
        }
    }
函数调用
数值转换
算术表达式求值

参考资料
https://leetcode.com/problems/valid-parentheses/description/

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值