栈的应用----判断括号是否匹配
2017-09-14 18:41
232 查看
好好学习,天天向上
需要考虑字符串中包含非括号的字符
嵌套情况下的匹配,比如这种{<>},嵌套的最里层一定是相邻匹配的。
遇到左括号入栈,遇到右括号则判断是否跟栈顶的左括号匹配,如果不匹配,则出现了交叉,整个字串括号不匹配。如果匹配,则栈顶括号出栈。循环该过程,最终栈为空则匹配。
下面是java实现代码:
================不甘心的分割线=========9.25更新================
之前的代码有bug,TEST_STRING = “[)]sss<[]**sdsf>()[]” 就能看到出错误了。
真的是太粗心了,bug产生的出处。
修改后的校验方法
题目要求
判断字符串中的括号是否能配对,括号不能有交叉,如({[])}是匹配的,(([])和([)]是不匹配的。解题思考
通过判断左括号和右括号的数量是否相等,无法排除不同类括号交叉出现的情况。比如([)]不能算匹配。需要考虑字符串中包含非括号的字符
嵌套情况下的匹配,比如这种{<>},嵌套的最里层一定是相邻匹配的。
遇到左括号入栈,遇到右括号则判断是否跟栈顶的左括号匹配,如果不匹配,则出现了交叉,整个字串括号不匹配。如果匹配,则栈顶括号出栈。循环该过程,最终栈为空则匹配。
下面是java实现代码:
package com.azhengye.demo; import java.util.HashMap; import java.util.Stack; public class Test { private static final String TEST_STRING = "[]sss<[]**sdsf>()[]"; private static HashMap<Character, Character> map = new HashMap<Character, Character>(); public static void main(String[] args) { map.put('[', ']'); map.put('{', '}'); map.put('(', ')'); map.put('<', '>'); boolean result = vaild(TEST_STRING); System.out.println("string match is=" + result); } private static boolean vaild(String string) { Stack<Character> stack = new Stack<Character>(); for (int i = 0; i < string.length(); i++) { char ch = string.charAt(i); if (map.containsKey(ch)) { stack.push(ch); } else if (map.containsValue(ch)) { if (stack.isEmpty()) { return false; } else { if (map.get(stack.peek()) == ch) { stack.pop(); } } } } return stack.isEmpty(); } }
================不甘心的分割线=========9.25更新================
之前的代码有bug,TEST_STRING = “[)]sss<[]**sdsf>()[]” 就能看到出错误了。
真的是太粗心了,bug产生的出处。
if (map.containsKey(ch)) { stack.push(ch); } else if (map.containsValue(ch)) { if (stack.isEmpty()) {//栈为空,试图将右括号入栈,返回false没问题。 return false; } else {//栈不为空,说明里面至少有一个左括号。 //如果栈顶的左括号跟当前的右括号匹配,则出栈,也没有问题。 //问题来了,如果栈顶的左括号跟当前的右括号不匹配,则什么也没有做,直接进行下次循环。比如"[)]"明显不匹配,但中间的")"被忽略了,导致bug产生。 if (map.get(stack.peek()) == ch) { stack.pop(); } } }
修改后的校验方法
private static boolean vaild(String string) { Stack<Character> stack = new Stack<Character>(); for (int i = 0; i < string.length(); i++) { char ch = string.charAt(i); if (map.containsKey(ch)) { stack.push(ch); } else if (map.containsValue(ch)) { if (!stack.isEmpty() && map.get(stack.peek()) == ch) { stack.pop(); } else { return false; } } } return stack.isEmpty(); }
相关文章推荐
- (容器配接器)堆栈应用:判断表达式中的括号是否匹配
- 字符串——判断一个括号字符串是否匹配
- 判断表达式中的括号是否匹配
- 华为机试 - 判断if语句括号是否匹配
- 括号问题 下面的代码用于判断一个串中的括号是否匹配 所谓匹配是指不同类型的括号必须左右呼应,可以相互包含,但不能交叉
- 顺序栈判断括号是否匹配
- 判断括号匹配是否正确:
- 判断输入的文字花括号是否匹配
- 如何判断一个字符串中的括号是否匹配
- 利用栈判断括号是否匹配
- 第5周时间项目3 判断输入的左右括号是否匹配
- 用栈判断表达式中的括号是否匹配
- 利用栈判断输入的表达式中的括号是否匹配(假设只含有左、右括号)
- [置顶] 【C语言】判断花括号{}是否匹配
- 判断一个括号字符串是否匹配
- 【数据结构】栈的应用——检测括号是否匹配
- 从标准输入获取C语言代码并判断花括号是否匹配
- 判断一个括号字符串是否匹配正确,如果括号有多种,怎么做?如(([]))正确,[[(()错误。
- 数据结构算法——判断表达式中的括号是否匹配
- 判断一个括号字符串是否匹配正确