文档讲解:代码随想录(代码随想录)
完成状态: true
1047. 删除字符串中的所有相邻重复项
class Solution {
public String removeDuplicates(String s) {
char[] ch = s.toCharArray();
Stack<Character> stack= new Stack<>();
for(int i = 1; i < ch.length; i++){
if(!stack.isEmpty() && ch[i] == stack.peek()){ //!stack.isEmpty()为了防止stack.peek()对空栈就行操作产生异常
stack.pop();
}else{
stack.push(ch[i]);
}
}
String result = ""; // 存储栈中的元素
while(!stack.isEmpty()){
result = result + stack.pop();
}
String reverseResult = new StringBuffer(result).reverse().toString(); //此时的字符串需要反转一下
return reverseResult;
}
}
20. 有效的括号
括号匹配是使用栈解决的经典问题。
栈中元素进栈的顺序和出栈的顺序是相反的,符号括号匹配的逻辑。括号的进栈的顺序应当和出栈相反,才是一个有效的匹配。如([{ }]),( )[ ]([{ }])(这种可以理解为三部分,先是对()进行匹配,然后是[],最后是([{ }]))。不符合的都是不匹配的。
考虑清楚不匹配的所有情况:
第一种情况,字符串里左方向的括号多余了 ,所以不匹配。
第二种情况,括号没有多余,但是 括号的类型没有匹配上。
第三种情况,字符串里右方向的括号多余了,所以不匹配。
class Solution {
public boolean isValid(String s) {
Stack<Character> stack = new Stack<>();
char[] ch = s.toCharArray();
for(char i:ch){
if(i == '('){
stack.push(')');
}
else if(i == '['){
stack.push(']');
}
else if(i == '{'){
stack.push('}');
}
// 在匹配右边括号的过程中,发现此时栈中的元素为空,没有左边括号进行匹配了,则说明右边括号多了,返回false;
// 在匹配右括号的过程中,发现左边与右边不匹配,返回false。
else if(stack.isEmpty() || stack.peek() != i){
return false;
}
else{
stack.pop();
}
}
// 匹配完所有字符串后,看栈中是否还有左边括号。
return stack.isEmpty();
}
}
150. 逆波兰表达式求值
将中缀表达式,转化为后缀表达式之后,计算机按照后缀表达式计算出来的结果就是我们所习惯的中缀表达式的计算结果。计算机可以利用栈来顺序处理,不需要考虑优先级了。也不用回退了, 所以后缀表达式对计算机来说是非常友好的。
其实也是相邻字符消除操作(栈擅长的操作),此题是相邻两个字符遇到操作符后通过计算消除。与上面两题思路大同小异。
class Solution {
public int evalRPN(String[] tokens) {
Stack<Integer> stack = new Stack<>();
for(int i = 0; i < tokens.length; i++){
if(tokens[i].equals("+")){
int elementFirst = stack.pop();
int elementSecond = stack.pop();
stack.push(elementFirst + elementSecond);
}else if(tokens[i].equals("-")){
int elementFirst = stack.pop();
int elementSecond = stack.pop();
stack.push(elementSecond - elementFirst);
}else if(tokens[i].equals("*")){
int elementFirst = stack.pop();
int elementSecond = stack.pop();
stack.push(elementSecond * elementFirst);
}else if(tokens[i].equals("/")){
int elementFirst = stack.pop();
int elementSecond = stack.pop();
stack.push(elementSecond / elementFirst);
}else{
stack.push(Integer.parseInt(tokens[i]));
}
}
return stack.peek();
}
}