1047.删除字符串中的相邻重复项
给出由小写字母组成的字符串 S,重复项删除操作会选择两个相邻且相同的字母,并删除它们。
在 S 上反复执行重复项删除操作,直到无法继续删除。
在完成所有重复项删除操作后返回最终的字符串。答案保证唯一。
示例:
- 输入:"abbaca"
- 输出:"ca"
- 解释:例如,在 "abbaca" 中,我们可以删除 "bb" 由于两字母相邻且相同,这是此时唯一可以执行删除操作的重复项。之后我们得到字符串 "aaca",其中又只有 "aa" 可以执行重复项删除操作,所以最后的字符串为 "ca"。
题外话:递归的实现
每一次递归调用都会把函数的局部变量·参数值和、返回地址压入栈中。
然后递归返回的时候,从栈顶弹出上一次递归的各项参数,所以这就是为什么递归可以返回上一层位置的原因。
public static String removeDuplicates(String s) {
char ch;
Stack<Character> stack = new Stack<>();
for (int i = 0; i < s.length();i++){
ch = s.charAt(i);
if(stack.isEmpty() || stack.peek()!=ch){
stack.push(ch);
}else {
stack.pop();
}
}
String str="";
while (!stack.isEmpty()){
str=stack.pop()+str;
}
return str;
}
150.逆波兰表达式求值
示例 1:
- 输入: ["2", "1", "+", "3", " * "]
- 输出: 9
- 解释: 该算式转化为常见的中缀算术表达式为:((2 + 1) * 3) = 9
示例 2:
- 输入: ["4", "13", "5", "/", "+"]
- 输出: 6
- 解释: 该算式转化为常见的中缀算术表达式为:(4 + (13 / 5)) = 6
示例 3:
-
输入: ["10", "6", "9", "3", "+", "-11", " * ", "/", " * ", "17", "+", "5", "+"]
-
输出: 22
思路:
遇到数字则入栈,遇到运算符则取出栈顶两个数字进行计算,并将结果压入栈中。
在Java中,要比较字符串内容是否相等用equals方法。在Java中,Stack类是一种遗留的类。在现代Java编程中,推荐使用deque接口的实现类来代替stack类。
public static int evalRPN(String[] tokens) {
LinkedList<Integer> stack = new LinkedList<>();
for (int i = 0; i < tokens.length; i++) {
if (tokens[i].equals("+")) {
stack.push(stack.pop() + stack.pop());
} else if (tokens[i].equals("-")) {
stack.push(-stack.pop() + stack.pop());
} else if (tokens[i].equals("*")) {
stack.push(stack.pop() * stack.pop());
} else if (tokens[i].equals("/")) {
int temp1 = stack.pop();
int temp2 = stack.pop();
stack.push(temp2 / temp1);
}else {
// Integer.valueOf()方法将一个int类型的数据转换为Integer对象
stack.push(Integer.valueOf(tokens[i]));
}
}
return stack.pop();
}