括号匹配检测问题

原题描述:
假设一个算术表达式中可以包含三种括号:圆括号"(" 和 ")",方括号"["和"]"和花括号"{"和"}",且这三种括号可按任意的次序嵌套使用(如:…[…{…}…[…]…]…[…]…(…)…)。编写判别给定表达式中所含括号是否正确配对出现的算法(已知表达式已存入数据元素为字符的顺序表中)。

解答:
本题属于栈的应用问题,充分利用了栈的入栈和弹栈功能。

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();
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_41876155/article/details/80063747
今日推荐