栈
栈,后进先出,每次出栈都是栈顶元素。
括号匹配
给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
测试用例:"()[]{}" "{[]}" "([)]"
来源:力扣(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) 均摊 相对数组队列,提升明显