问题描述:对一个字符串的左右括号进行匹配。
输入:一个字符串表达式
输出:匹配成功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+"");
}
}