Leetcode 20 有效的括号
题目描述
给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
示例 1:
输入:s = “()”
输出:true
示例 2:
输入:s = “()[]{}”
输出:true
示例 3:
输入:s = “(]”
输出:false
示例 4:
输入:s = “([)]”
输出:false
示例 5:
输入:s = “{[]}”
输出:true
分析和具体实现
这个问题是栈的一个常规应用了,直接上代码:
class Solution {
public boolean isValid(String s) {
HashMap<Character, Character> map = new HashMap<>();
map.put(')', '(');
map.put(']', '[');
map.put('}', '{');
if(s.length()%2 == 1 || map.containsKey(s.charAt(0))){
return false;
}
Deque<Character> stack = new LinkedList();
for(int i=0;i<s.length();i++){
char temp = s.charAt(i);
if(map.containsKey(temp)){
if(stack.isEmpty()){
return false;
}
Character left = stack.pop();
if(map.get(temp) != left){
return false;
}
}else{
stack.push(temp);
}
}
if(!stack.isEmpty()){
return false;
}
return true;
}
}
效果:
剑指 offer 09 用两个栈实现队列
题目描述
用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )
示例 1:
输入:
[“CQueue”,“appendTail”,“deleteHead”,“deleteHead”]
[[],[3],[],[]]
输出:[null,null,3,-1]
示例 2:
输入:
[“CQueue”,“deleteHead”,“appendTail”,“appendTail”,“deleteHead”,“deleteHead”]
[[],[],[5],[2],[],[]]
输出:[null,-1,null,null,5,2]
提示:
1 <= values <= 10000
最多会对 appendTail、deleteHead 进行 10000 次调用
分析和具体实现
这个问题其实并不是很复杂,但是题目的输入输出容易让你搞糊涂,不知道自己究竟应该干什么。其实,对于这个问题,输入输出其实并不重要,只需要完成对应的函数即可。
观察题目给出的模板,可以看出,除了删除操作需要返回值,其他的并不需要。
- 初始化函数 CQueue:我们只需要初始化两个 stack 即可,分别记为 stack1,stack2。
- 增加函数 appendTail:给 stack1 进行 push 操作
- 删除函数 deleteHead:将 stack1 中的元素放入 stack2 中,然后弹出第一个元素即可。
class CQueue {
public CQueue() {}
public void appendTail(int value) {}
public int deleteHead() {}
}
具体实现:
class CQueue {
Deque<Integer> stack1;
Deque<Integer> stack2;
public CQueue() {
stack1 = new LinkedList();
stack2 = new LinkedList();
}
public void appendTail(int value) {
stack1.push(value);
}
public int deleteHead() {
if(stack2.isEmpty()){
if(stack1.isEmpty()){
return -1;
}else{
while(!stack1.isEmpty()){
stack2.push(stack1.pop());
}
}
}
return stack2.pop();
}
}
效果如下: