2020年6月15日 LeetCode日记——【数据结构】栈与队列

有效的括号

题目描述:

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

有效字符串需满足:

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

示例 1:

输入: "()"
输出: true

代码:

class Solution {
    public boolean isValid(String s) {
        if(s.isEmpty()) return true;
        Stack<Character> stack = new Stack<>();
        for(char c:s.toCharArray()){
            if(c=='('){
                stack.push(')');
            }else if(c=='['){
                stack.push(']');
            }else if(c=='{'){
                stack.push('}');
            }else if(stack.isEmpty()||c!=stack.pop()){
                return false;
            }
            
        }
        if(stack.isEmpty()) return true;
        return false;     
    } 
}

分析:

创建一个栈。遍历字符序列,如果字符为3种左半括号,就push一个对应的右半括号入栈。

其他情况判断当前字符是否等于栈顶元素或栈是否为空,若为空或者不等于,返回false。

遍历完成后,若栈为空,返回true。

 

用队列实现栈

题目描述:

使用队列实现栈的下列操作:

push(x) -- 元素 x 入栈
pop() -- 移除栈顶元素
top() -- 获取栈顶元素
empty() -- 返回栈是否为空

代码:

class MyStack {
    private Queue<Integer> queue;
    /** Initialize your data structure here. */
    public MyStack() {
        queue = new LinkedList<>();

    }
    
    /** Push element x onto stack. */
    public void push(int x) {
        queue.add(x);
        int cnt = queue.size();
        while (cnt-- > 1) {
            queue.add(queue.poll());
        }

    }
    
    /** Removes the element on top of the stack and returns that element. */
    public int pop() {
         return queue.remove();

    }
    
    /** Get the top element. */
    public int top() {
        return queue.peek();

    }
    
    /** Returns whether the stack is empty. */
    public boolean empty() {
        return queue.isEmpty();

    }
}

分析:

在将一个元素 x 插入队列时,为了维护原来的后进先出顺序,需要让 x 插入队列首部。而队列的默认插入顺序是队列尾部,因此在将 x 插入队列尾部之后,需要让除了 x 之外的所有元素出队列,再入队列。

posted @ 2020-07-21 23:40  菅兮徽音  阅读(131)  评论(0编辑  收藏  举报