20. 有效的括号
20. 有效的括号
class Solution {
public boolean isValid(String s) {
//符号匹配是经典的栈的问题
Deque<Character> dequeue = new LinkedList<>();
char ch;
for(int i = 0 ; i < s.length() ; i ++){
if(s.charAt(i) == '{'){
dequeue.push('}');
}
else if (s.charAt(i) == '['){
dequeue.push(']');
}
else if(s.charAt(i) == '('){
dequeue.push(')');
}
else if (dequeue.isEmpty() || dequeue.peek() != s.charAt(i)){
return false;
}
else{
dequeue.pop();
}
}
return dequeue.isEmpty();
}
}
1047. 删除字符串中的所有相邻重复项
1047. 删除字符串中的所有相邻重复项
class Solution {
public String removeDuplicates(String s) {
//ArrayDeque会比LinkedList在除了删除元素这一点外会快一点
//参考:https://stackoverflow.com/questions/6163166/why-is-arraydeque-better-than-linkedlist
//ArrayDeque<Character> deque = new ArrayDeque<>();
//此题也是用栈的结构,通过比较该元素和上一个元素是否相等,进行入栈和出栈的操作
Deque<Character> deque = new LinkedList<>();
for(int i = 0; i < s.length(); i++){
if(deque.isEmpty() || deque.peek() != s.charAt(i)){
//栈为空或者不相等则继续入栈
deque.push(s.charAt(i));
}
else {
deque.pop();
}
}
//最后在翻转一下可得到结果
String str = "";
while (!deque.isEmpty()) {
str = deque.pop() + str;
}
return str;
}
}
150. 逆波兰表达式求值
150. 逆波兰表达式求值
class Solution {
public int evalRPN(String[] tokens) {
//逆波兰表达式其实是一个很典型的栈的问题
//注意中序表达式和后序表达式的转换
Deque<Integer> stack = new LinkedList();
for(String s : tokens){
if("+".equals(s)){
//注意string类型的比较相等用equals()实现
stack .push(stack.pop() + stack.pop());
}
else if ("-".equals(s)){
stack.push(-stack.pop() + stack.pop());
}
else if("*".equals(s)){
stack.push(stack.pop() * stack.pop());
}
else if("/".equals(s)){
int t1 = stack.pop();
int t2 = stack.pop();
stack.push(t2/t1);
}
else{
//注意将字符串转化为数字压入栈之中
stack.push(Integer.valueOf (s));
}
}
return stack.pop();
}
}