数据结构基础6:栈应用之括号匹配

问题描述:对一个字符串的左右括号进行匹配。

输入:一个字符串表达式

输出:匹配成功true或匹配失败false

例如:假设一个算术表达式中可以包含三种括号:圆括号“()”,方括号“[]”和花括号“{}”,且这三种括号可按任意的次序嵌套使用如:(a+b)[c*({d-e)]},返回false。编写判别给定表达式中所含括号是否正确配对出现的算法。

匹配思想:通过观察可以发现,如果从左向右扫描一个字符串表达式,那么每个右括号都与最近扫描的那个未匹配的左括号相配。

算法思想:

因此我们可以在从左至右的扫描过程中把所有遇到的左括号存放到栈中,

每当遇到一个右括号的时候,检查栈是否为空,如果为空则意味着多出一个右括号,返回false;而如果栈不为空,就将它与栈顶的左括号相匹配:如果括号类型相同,就认为匹配成功继续向下读入,并从栈顶删除掉该左括号;否则返回false。

另外,在算法的开始和结束时,栈都应该是空的.所以匹配到最后还要判断栈是否为空,若非空,则说明多了左括号,匹配失败。

public class BracketMatch9
 {

	public boolean isMatch(String s)
	{
	    Stack<Character> stack = new Stack<>();
		
	    //从左至右扫描字符串
	    for(int i =0;i<s.length();i++)
	    {   
		char temp = s.charAt(i);
		switch(s.charAt(i))//switch 语句用于基于不同的条件来执行不同的动作。
		{
		     //如果读入左括号则入栈
		     case '(':
		     case '[':
		     case '{':

		     stack.push(temp);//java5.0后引入自动装箱,char会自动转化为Character对象
		     break;//继续向下读入

		     //如果读入右括号,则看是否与栈顶左括号匹配
		     case ')':
		     case ']':
		     case '}':

	            if(stack.empty())//栈为空,说明多出右括号
		       return false;
	            else 
	           {   
		//如果读入的右括号与栈顶的左括号类型相同,则让该左括号出栈,然后继续向下扫描
		if((temp==')'&&stack.peek()=='(')||(temp ==']'&&stack.peek()=='[')||(temp=='}'&&stack.peek()=='{'))
						  
                {
			stack.pop();
		}
	           }

	       break;
	}
			
}
		
		//扫描完字符串后,如果栈非空,则说明多了左括号没匹配
		if(!stack.empty())
		   return false;
		
		return true;
	}
  
	
	public static void main(String[] args) {
		
		boolean isMatch= new BracketMatch9().isMatch("(a+b)[c*(d-e)]");
		System.out.println(isMatch+"");
		
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Java架构何哥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值