假设有如下字符串: (234453)[234]{2324} 现在,要求编程分析其括号配对是否正确。请自行选择下列两种方案之一实现该程序:
方案一:不考虑括号优先级,只考虑配对正确性;方案二:考虑括号优先级,比如{1[2(3)4]5} 是正确的。但是[1{2}3]是不正确的。
package javaTest;
import java.util.Stack;
public class JavaTest {
public static boolean solve(StringBuilder str) {
if (str.length() == 0) return false;
Stack<Character> stack = new Stack<Character>();
for (int i = 0; i < str.length(); i++) {
char ch = str.charAt(i);
switch (ch) {
case '{':
case '[':
case '(':
if (!stack.empty()) {
char chX = stack.peek();
if ((ch == '{' && chX == '{')
|| (ch == '{' && chX == '[')
|| (ch == '{' && chX == '(')
|| (ch == '[' && chX == '[')
|| (ch == '[' && chX == '(')
|| (ch == '(' && chX == '(')) {
return false; //左括号入栈前,要判断优先级,如果不符合,则false
} else {
stack.push(ch); //符合优先级,则入栈
}
} else {
stack.push(ch);
}
break;
case '}':
case ']':
case ')':
if (!stack.empty()) {
char chX = stack.pop();
if ((ch == '}' && chX != '{')
|| (ch == ']' && chX != '[')
|| (ch == ')' && chX != '('))
return false;
} else {
return false;
}
break;
default:
break;
}
}
if (!stack.empty()) //栈内不为空,则证明还有左括号没有匹配,所以false
return false;
else
return true;
}
public static void main(String[] args) {
StringBuilder str = new StringBuilder();
str.append("(){}[]{[]}([])");
System.out.print(solve(str));
}
}
public static boolean check1(String str) {
Stack<String> stack = new Stack<String>();
char[] charArr = str.toCharArray();
for(int i=0; charArr!=null && i<charArr.length; i++) {
if("{}[]()".indexOf(charArr[i])>-1) {
if(stack.size()==0) {
stack.push(String.valueOf(charArr[i]));
} else {
String top = stack.peek();
String tmp = top + charArr[i];
if("{}[]()".indexOf(tmp)>-1) {
stack.pop();
} else {
stack.push(String.valueOf(charArr[i]));
}
// 方案2与方案1不同的就是,在这个地方加一个优先级判断
if("([{".indexOf(tmp)>-1 || "({".indexOf(tmp)>-1)
return false;
}
}
}
return stack==null || stack.size()==0?true:false;
}
function Stack(){
var items = [];
this.push = function(element){
items.push(element);
};
this.pop = function(){
return items.pop();
};
this.size = function(){
return items.length;
};
}
function check(str){
var arr =str.split('');
var stack= new Stack();
var aString = '({[]})';
var index = -1;
for(var i=0;i<arr.length;i++){
var item = arr[i];
if((index = aString.indexOf(item))<3){
stack.push(item);
}else{
var target = stack.pop();
if(!target){
return false;
}
if(target!==aString.charAt(5-index)){
return false;
}
}
}
if(stack.size()){
return false;
}else{
return true;}
}
使用栈,碰到左括号入栈,碰到右括号出栈,看最后栈是否空,是否还有未匹配完的右括号。
方案二:
思路同上,但是检查压栈时要对括号做优先级检查。