有效的括号题目如下所示:

由于没有系统性的学过数据结构,所以看到这种简单的括号匹配问题是很难想到直接用栈结构来做的,所以还是需要学习一下,趁着现在时间还算充裕。
思路:想清楚不匹配的所有情况-①多出左括号;②多出右括号;③括号刚好,但两者不匹配;
用栈的思想来做的话,就是先将左括号存入栈中,看遇到的右括号是否与之匹配(一定是从栈顶移除),如果所有的左括号都匹配完成了,栈内还有元素的话就说明存在上面三种情况之一。
代码如下:
class Solution {
public boolean isValid(String s) {
//括号匹配是经典的用栈问题
//对应的另一半一定在栈顶
Stack<Character> stack = new Stack<>();
//思路:先把左括号存入存入栈中,用右括号进行匹配
for(char c : s.toCharArray()){
//有对应的一半就直接消消乐
if(c == ')' && !stack.isEmpty() && stack.peek() == '('){
stack.pop();
}else if(c == ']' && !stack.isEmpty() && stack.peek() == '['){
stack.pop();
}else if(c == '}' && !stack.isEmpty() && stack.peek() == '{'){
stack.pop();
}else{
stack.push(c);
}
}
return stack.isEmpty();
}
}
删除字符串中的所有相邻重复字符题目如下:

这里引入了能够直接装字符串的栈,无需像平常的栈那样最后还要转为字符串,这个思路比较简单:一看重复且相邻,就马上想到用栈来做,当入栈元素与栈顶元素相同时,直接移除栈顶原酸,否则添加新元素。
代码如下:
class Solution {
public String removeDuplicates(String s) {
//可以直接拿字符串作为栈,这样省去了栈还要转为字符串的操作
StringBuffer res = new StringBuffer();
//记录栈的长度
int top = -1;
for(int i =0; i < s.length(); i++){
char c = s.charAt(i);
//top>=0,说明栈中有字符串,当前字符串如果和栈中字符相等则弹出栈顶字符,同时top-1
if (top >= 0 && res.charAt(top) == c){
res.deleteCharAt(top);
top--;
}else{
res.append(c);
top++;
}
}
return res.toString();
}
}

被折叠的 条评论
为什么被折叠?



