如果表达式中的括号成对出现则合法;否则不合法。
例一:
输入:
“{()[ ]()}”
输出:
true;
例二:
输入:
“{()[](}”
输出:false;
方法一:
利用Ascii的差值判断是否为一对,(),{},[]的左右差值为1或2;如果为一对,栈定元素弹栈;
如果不是则进栈;
代码如下:
import java.util.LinkedList;
public class Text {
public static void main(String[] args) {
String str = "(){[()]()}";
System.out.print(isLegal(str));
}
public static boolean isLegal(String str) {
LinkedList<Character> stack = new LinkedList<Character>();
// TODO Auto-generated method stub
for(int i=0;i<str.length();i++){
char c= str.charAt(i);
if(stack.isEmpty()){
stack.push(c);
}else{
Character ch = stack.peek();
if(c-ch==1||c-ch==2){
stack.pop();
}else{
stack.push(c);
}
}
}
if(stack.size()==0)
return true;
return false;
}
}
方法二:
利用HashMap键值对的特性,将括号的一半命名为键另一半为值;获取键的值与栈顶元素比较若
相等则将栈顶元素弹栈否则入栈;
import java.util.HashMap;
public class MatchBracket {
public static void main(String[] args) {
solution02();
}
private static void solution02() {
String str = "{()[[()]]<{()>}()";
HashMap<Character,Character> map = new HashMap<>();
map.put('[',']');
map.put('<','>');
map.put('(',')');
map.put('{','}');
ArrayStack<Character> stack = new ArrayStack<>();
for (int i = 0; i < str.length(); i++) {
char c = str.charAt(i);
if (stack.isEmpty()) {
stack.push(c);
} else {
char top = stack.peek();
if (map.containsKey(top) && c == map.get(']')) {
stack.pop();
} else {
stack.push(c);
}
}
}
System.out.println(stack.isEmpty());
}
}