玩转数据结构笔记(3)

180 阅读2分钟

栈,后进先出,每次出栈都是栈顶元素。

括号匹配

给定一个只包括 '('')''{''}''['']' 的字符串,判断字符串是否有效。

有效字符串需满足:

左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。

测试用例:"()[]{}" "{[]}" "([)]"

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/valid-parentheses
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
class s {
    public boolean isValid(String s) {
        HashMap<Character,Character> map = new HashMap();
        map.put('(',')');
        map.put('{','}');
        map.put('[',']');
        Stack stack = new Stack();
        for(int i=0;i<s.length();i++){
            // 如果入栈的和当前栈顶的不匹配,那么继续入栈
            if(stack.peek() != null && !s.charAt(i).equals(map.get(stack.peek())){
                stack.push(s.charAt(i));
            }else{
                //如果匹配了 那么出栈
                stack.pop();
            }
        }
        return stack.isEmpty()
    }
}

队列

队列,先进先出,每次出队都是队首元素。

数组队列

普通的使用动态数组实现队列。

下标为0的为队首,出队后,后面的元素向前补位。

复杂度:

入队:O(1) 均摊

出队:O(n) 每次出队,我们要把出队元素后面的元素向前移动,遇到缩容还要O(n)

循环队列

为了解决数组队列出队的性能问题,我们使用循环队列。

循环队列基于数组队列,修改了队首队尾位置以及入队和出队的逻辑。

使用一个变量(front)记录队首位置,tail记录队尾,不再补位。

但是这样会出现一个新的问题,不补位,出队后的空间就浪费了。

当我后面空间都用完了,前面的空间其实还可以再用的

tail = (tail+1) % queue.length

那么怎么判断我当前队列已经满了呢?再入队一个元素,就满了,同时front === tail,但是front === tail 是我们判断队列为空的条件,所以,我们浪费一个空间,用来保留判断队列为满。

(tail+1)%queue.length === front

复杂度:

入队:O(1) 均摊

出队:O(1) 均摊 相对数组队列,提升明显