代码随想录算法训练营
今日任务
20. 有效的括号 ,1047. 删除字符串中的所有相邻重复项 ,150. 逆波兰表达式求值
20. 有效的括号
class Solution {
public boolean isValid(String s) {
boolean flag=false;
//定义一个栈
Stack<Character> stack=new Stack<>();
char[] ch = s.toCharArray();
if(ch[0]==')'||ch[0]=='}'||ch[0]==']'){
return flag;
}
int count=0;
for (int i = 0; i < ch.length; i++) {
if(ch[i]=='('||ch[i]=='{'||ch[i]=='['){
stack.push(ch[i]);
}else{
if(!stack.isEmpty()){
Character pop = stack.pop();
if((pop=='('&&ch[i]==')')||(pop=='{'&&ch[i]=='}')||(pop=='['&&ch[i]==']')){
count++;
}
}else{
break;
}
}
}
if(count*2==ch.length){
flag=true;
}
return flag;
}
}
1047. 删除字符串中的所有相邻重复项
class Solution {
public String removeDuplicates(String s) {
//定义一个栈
Stack<Character> stack=new Stack<>();
char[] ch = s.toCharArray();
for (int i = 0; i < ch.length; i++) {
if(stack.isEmpty()){
//栈为空,则直接插入数据
stack.push(ch[i]);
}else{
//栈不为空,首先跟栈顶元素进行判断
Character top = stack.peek();
if(top==ch[i]){
//如果栈顶元素与需要插入的元素相同
//弹出栈顶元素
stack.pop();
}else{
//不相同,则插入
stack.push(ch[i]);
}
}
}
int size = stack.size();
char[] result=new char[size];
for (int i = result.length-1; i >= 0; i--) {
result[i]=stack.pop();
}
return new String(result);
}
}
150. 逆波兰表达式求值
//注意!
//力扣中判断string相等不能用==
class Solution {
public int evalRPN(String[] tokens) {
//定义一个栈
Stack<String> stack=new Stack<>();
for (int i = 0; i < tokens.length; i++) {
if((tokens[i].equals("+"))||(tokens[i].equals("-"))||(tokens[i].equals("*"))||(tokens[i].equals("/"))) {
int b = Integer.parseInt(stack.pop());
int a = Integer.parseInt(stack.pop());
int c = 0;
if (tokens[i].equals("+")) {
c = a + b;
} else if (tokens[i].equals("-")) {
c = a - b;
} else if (tokens[i].equals("*")) {
c = a * b;
} else if (tokens[i].equals("/")) {
c = a / b;
}
stack.push(String.valueOf(c));
}else{
stack.push(tokens[i]);
}
}
int result= Integer.parseInt(stack.peek());
return result;
}
}