原题描述:
假设一个算术表达式中可以包含三种括号:圆括号"(" 和 ")",方括号"["和"]"和花括号"{"和"}",且这三种括号可按任意的次序嵌套使用(如:…[…{…}…[…]…]…[…]…(…)…)。编写判别给定表达式中所含括号是否正确配对出现的算法(已知表达式已存入数据元素为字符的顺序表中)。
解答:
本题属于栈的应用问题,充分利用了栈的入栈和弹栈功能。
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(); } }