原题描述: 假设一个算术表达式中可以包含三种括号:圆括号”(” 和 “)”,方括号”[“和”]”和花括号”{“和”}”,且这三种括号可按任意的次序嵌套使用(如:…[…{…}…[…]…]…[…]…(…)…)。编写判别给定表达式中所含括号是否正确配对出现的算法(已知表达式已存入数据元素为字符的顺序表中)。
解答: 本题属于栈的应用问题,充分利用了栈的入栈和弹栈功能。
1. 我的解答 经过查询ASCII码,}])相对于{[(相差1或者2,而表达式中又只有这六种符号,所以判别条件写出这样的形式,但这并不是一种 很好的解决方案。
import java.util.Scanner;
import java.util.Stack;
public class parenthesis_matching {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
Stack<Character> a = new Stack<>();
int n = sc.nextInt();
String s = sc.next();
boolean flag = true;
for(int i = 0;i < n;++i) {
char c = s.charAt(i);
if(c == '(' ||c == '{' ||c == '[' ) {
a.push(c);
}
else {
char m = a.peek();
if(c == m + 1 || c == m + 2) {
a.pop();
}
else {
System.out.println("false");
flag = false;
break;
}
}
}
if (flag == true) {
if (a.isEmpty())
System.out.println("true");
else {
System.out.println("false");
}
}
}
}
2. 别人的解答:
点击打开链接 需要学习的知识点: a. 之前一直想写sc.hasNext()方法,但无奈总调不对,才用了先输入数字,再用循环的方法,这里用while(sc.hasNext)更加方便,而且char[] bytes = target.toCharArray的写法也值得学习。 b. 将括号串存入char数组之后,就方便很多,可以用栈顶元素和数组中下一个字符相匹配。
import java.util.Scanner;
import java.util.Stack;
public class SymbolMatch {
public static void main(String[] args) {
Stack<Character> stack = new Stack<Character>();
Scanner sc = new Scanner(System.in);
while (sc.hasNext()) {
String target = sc.nextLine();
char[] bytes = target.toCharArray();
// 将第一个字符压入栈
stack.push(bytes[0]);
/*
* 从第二个字符开始,依次与栈中的字符匹配
*/
for (int i = 1; i < bytes.length; ++i) {
Character c1 = (Character) stack.peek();
Character c2 = bytes[i];
if ((c1.toString().equals("(") && c2.toString().equals(")"))
|| (c1.toString().equals("[") && c2.toString().equals("]"))
|| (c1.toString().equals("{") && c2.toString().equals("}"))) {
stack.pop();
} else {
stack.push(c2);
}
}
boolean isMatch = stack.isEmpty();
System.out.println("栈内内容:" + stack);
System.out.println("括号匹配结果:" + isMatch);
}
sc.close();
}
}