算法训练 括号检查 java 题解 517

39 篇文章 0 订阅
5 篇文章 1 订阅

题目描述: 

我们知道,编程中表达式常常只能使用小括号来改变运算的先后次序,并且没有其他括号可以使用。比如一元二次方程求根的表达式:
  -b+sqrt(b*b-4*a*c)/(2*a)
  再比如求用海伦公式求三角形的面积:
  ((a+b+c)/2-a)*((a+b+c)/2-b)*((a+b+c)/2-c)*(a+b+c)/2
  如果剥离出上述表达式的字母,只保留括号,则它们分别为:
  ()()
  (())(())(())()
  括号添加的规则是:
  1、总体上看,左右括号必须数量一样多。
  2、从左到右依次看,任何时候右括号不能多于左括号
  并不总是一眼能看出括号的添加是否正确。所以请你编写程序检查括号添加是否正确。

输入格式

  一行只由左右括号构成的字符串。

输出格式

  括号添加正确,则输出yes,否则输出no

样例输入

()()

样例输出

yes

数据规模和约定

  括号串长度不会超过256个,则字符串不为空

解题思路:

出现括号不匹配有两种情况:①左括号多余 ②右括号多余,可以只要遇见左括号就进栈,右括号就出栈,①:扫描完后栈不空,仍留有左括号。②出栈时栈已经为空。如果上两种情况都不满足,即说明括号都匹配。

java代码:

import java.io.*;
import java.util.*;

public class Main {
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		String s = br.readLine();
		Stack<Character> st = new Stack<>();
		boolean flag = true;
		for(int i = 0; i < s.length();i++) {
			char temp = s.charAt(i);
			if(temp == '(') {
				st.push(temp);
			}else {
				if(st.size() > 0) {
					st.pop();
				}else {
					flag = false;
					System.out.println("no");
					break;
				}
			}
		}
		if(st.size() == 0 && flag) {
			System.out.println("yes");
		}else if(st.size() != 0 && flag){
			System.out.println("no");
		}
	}
}

提交截图:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值