1.因为之前用栈写过括号匹配的问题,所以想直接用栈解决此问题。后来发现不用栈更简单,答案在后面一个代码里面展示。
首先判断当前待处理的字符是否是)
,如果是,就逐个弹出栈顶元素,直到左括号(
弹出为止。(删除括号里面的内容)
然后,当前待处理的字符是<
, 且栈顶元素不是(
,就弹出栈顶元素,
剩下的情况直接入栈。
package com.test;
import java.util.Scanner;
import java.util.Stack;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String s = sc.next();
Stack<Character> stack = new Stack<Character>();
for(int i=0; i<s.length(); i++) {
if (s.charAt(i) == ')') {
while(true) {
if(stack.peek() == '(') {
stack.pop();
break;
}
stack.pop();
}
} else if(s.charAt(i) == '<') {
if (!stack.isEmpty() && stack.peek() != '(' && stack.peek() != ')') {
stack.pop();
}
} else {
stack.push(s.charAt(i));
}
}
System.out.println(stack);
while (! stack.isEmpty()) {
System.out.print(stack.pop());
}
}
}
2.没有涉及栈的解决方案。
package com.bishi;
import java.util.Scanner;
public class kuohao {
public static void main(String[] args) {
kuohao test = new kuohao();
System.out.println(test.get());
}
private String get() {
Scanner sc = new Scanner(System.in);
String str = sc.next();
char pre = '\0';
int k = 0;
StringBuilder newStr = new StringBuilder();
for (int i = str.length() - 1; i >= 0; i--) {
char cur = str.charAt(i);
// abc<<bf()a((cfds)<)
if (cur == ')') {
if (pre == ')') {
k++;
} else {
pre = ')';
k = 1;
}
continue;
}
if (cur == '(') {
k--;
if (k == 0) {
pre = '\0';
}
continue;
}
if (pre == ')') {
continue;
}
if (cur == '<') {
if (pre == '<') {
k++;
}
if (pre == '\0') {
pre = '<';
k = 1;
}
continue;
}
if (pre == '<') {
k--;
if (k == 0) {
pre = '\0';
}
continue;
}
newStr.append(str.charAt(i));
}
newStr.reverse();
return newStr.toString();
}
}