一、算法题
20. 有效的括号
class Solution {
public boolean isValid(String s) {
Stack<Character> sn=new Stack<>();
for(int i=0;i<s.length();i++){
char c=s.charAt(i);
if(c=='('||c=='{'||c=='['){
sn.push(c);
}
else {
//此时字符是右括号,如果此时栈里面为空,说明一定遇不到能与之匹配的左括号,所以return false
if(sn.isEmpty()){
return false;
}
//此时已经弹出了左括号
char a=sn.pop();
//左右括号不匹配的现象
if(c==')'&&a!='('){
return false;
}
if(c=='}'&&a!='{'){
return false;
}
if(c==']'&&a!='['){
return false;
}
}
}
//如果都能匹配成功,最后栈一定是空的,只要不为空就肯定出错
//包括左括号多余的情况
return sn.isEmpty();
}
}
1047. 删除字符串中的所有相邻重复项
class Solution {
public String removeDuplicates(String s) {
Stack<Character> sn=new Stack<>();
for(int i=0;i<s.length();i++){
char c=s.charAt(i);
if(sn.isEmpty()){
sn.push(c);
}else{
if(c==sn.peek()){
sn.pop();
}else{
sn.push(c);
}
}
}
String str="";
while(!sn.isEmpty()){
str+=sn.pop();
}
StringBuilder sb=new StringBuilder(str);
return sb.reverse().toString();
}
}
- 当最后栈里面保留的是目标答案的翻转,要得到正确答案先得把这个字符串翻转过来
- 所以使用了StringBuilder的reverse()方法
150. 逆波兰表达式求值
class Solution {
public int evalRPN(String[] tokens) {
Stack<Integer> sn=new Stack<>();
for(String s:tokens){
if("+".equals(s)){
sn.push(sn.pop()+sn.pop());
}else if("-".equals(s)){
//先被pop出去的是被减数
sn.push(-sn.pop()+sn.pop());
}else if("*".equals(s)){
sn.push(sn.pop()*sn.pop());
}else if("/".equals(s)){
int down=sn.pop();
int up=sn.pop();
sn.push(up/down);
}else {
//在加入数字元素时要转换为Integer
//其他加减乘除处理的都是Integer类型的栈sn里的元素
sn.push(Integer.valueOf(s));
}
}
return sn.peek();
}
}
逆波兰表达式
- 又叫后缀表达式
- 在后缀表达式中,操作符位于操作数之后