今天是栈的应用——符号匹配问题,该算法的思想是,读取字符串,遇到左括号入栈,遇到右括号就将栈顶元素出栈,判断是否匹配,以此来完成符号的匹配问题。
话不多说,看代码。通过初始化一个“#”在栈底,来判断最终结果栈是否空,以此来判断结果是否正确。
代码中的pop( )、push( )方法在DAY7的代码中体现(抄代码DAY7_DEJONG6的博客-CSDN博客)利用switch语句来实现符号的匹配判断,左括号入栈,右括号弹出栈顶元素来进行匹配。当然在表达式中还有数字等非符号元素,检验到这些元素时可以用default置之不理。
(看代码注释)
public static boolean bracketMatching(String paraString) {
CharStack tempStack = new CharStack();
tempStack.push('#');//在栈底输入#来初始化栈
char tempChar, tempPopedChar;
//处理字符串 ,其中length不是成员变量,而是一种方法
for (int i = 0; i < paraString.length(); i++) {
tempChar = paraString.charAt(i);//读取字符串
switch (tempChar) {//判断字符串的括号
case '(':
case '[':
case '{':
tempStack.push(tempChar);//左括号元素入栈
break;//结束循环
case ')':
tempPopedChar = tempStack.pop();
if (tempPopedChar != '(') {
return false;
} // Of if
break;
case ']':
tempPopedChar = tempStack.pop();
if (tempPopedChar != '[') {
return false;
} // Of if
break;
case '}':
tempPopedChar = tempStack.pop();
if (tempPopedChar != '{') {
return false;
} // 右括号时候,栈顶元素出栈利用if检验是否匹配
break;
default:
//除以上情况外什么
}// Of switch
} // Of for
tempPopedChar = tempStack.pop();
if (tempPopedChar != '#') {
return false;
} //最后栈非空表示符号匹配失败
return true;
}
在main方法里进行检验:定义待检验
boolean tempMatch;
String tempExpression = "[2 + (1 - 3)] * 4";//待检验字符串
tempMatch = bracketMatching(tempExpression);
System.out
.println("Is the expression " + tempExpression + " bracket matching? " + tempMatch);//打印待检验字符串
tempExpression = "( ) )";
tempMatch = bracketMatching(tempExpression);
System.out
.println("Is the expression " + tempExpression + " bracket matching? " + tempMatch);
tempExpression = "()()(())";
tempMatch = bracketMatching(tempExpression);
System.out
.println("Is the expression " + tempExpression + " bracket matching? " + tempMatch);
tempExpression = "({}[])";
tempMatch = bracketMatching(tempExpression);
System.out
.println("Is the expression " + tempExpression + " bracket matching? " + tempMatch);
tempExpression = ")(";
tempMatch = bracketMatching(tempExpression);
System.out
.println("Is the expression " + tempExpression + " bracket matching? " + tempMatch);
检验结果为
我们进行其他式子进行匹配
补充:学习了字符串匹配算法,就可以利用栈实现后置表达式的计算,以及中缀表达式转后缀表达式、中缀转后缀一系列算法。