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 之外的所有元素出队列,再入队列。