Q:给定一个含有'(', ')', '{', '}', '[' 和']'字符串,判断这些符号是否语法匹配
A:
本题用栈来实现。
首先科普一下栈的几个方法:
1、实例化 Stack stack=new Stack();
2、判断是否为空 stack.empty()
3、取栈顶值(不出栈) stack.peek()
4、进栈 stack.push(Object);
5、出栈stack.pop();
解法:
1、首先定义一个map,将左右对应的符号,分别作为key和value存入。
2、依次去读取字符串中的每一个字符,如果是左边的字符,则加入栈。
3、如果读入的字符是右边的符号,则判断栈是否为空,且栈顶的字符是否是对应的左边字符,如果都满足,则将栈顶的字符取出;否则,就表示字符串不匹配。
4、依次全部读取字符串,如果此时栈是空的,则表示字符串全部都匹配;否则就表示不匹配。
package suanfa;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Stack;
public class StackExe {
public static boolean isValid(String s) {
if (s == null || s.length() % 2 == 1) {
return false;
}
HashMap<Character, Character> map = new HashMap<Character, Character>();
map.put('(', ')');
map.put('[', ']');
map.put('{', '}');
Stack<Character> stack = new Stack<Character>();
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
if (map.keySet().contains(c)) {
stack.push(c);
} else if (map.values().contains(c)) {
if (!stack.empty() && map.get(stack.peek()) == c) {
stack.pop();
} else {
return false;
}
}
}
return stack.empty();
}
public static void main(String[] args) {
ArrayList<String> arrayList = new ArrayList<>();
arrayList.add("[]{}{}()");
arrayList.add("{[()]}");
arrayList.add("{[(])}");
arrayList.add("{[([)]}");
for (int i =0 ;i<arrayList.size();i++){
System.out.println(arrayList.get(i)+" is "+ isValid(arrayList.get(i)));
}
}
}
网友评论