栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

栈的应用之分隔符匹配问题(Java实现)

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

栈的应用之分隔符匹配问题(Java实现)

问题引入

在Java的表达式中分隔符有左分隔符("(","{","[",""),要分情况讨论:①栈为空,即没有遇到左分隔符或者之前的分隔符都已经完全匹配好了,那么很明显此时这个右分隔符是没有一个左分隔符与之匹配的,就像"(())]“②栈不为空,但是右分隔符与栈顶的左分隔符并不匹配,那么也很明显此时是不匹配的,就像”((]"③栈不为空且此时右分隔符与栈顶的左分隔符是匹配的,那么栈顶的左分隔符就可以出栈了

  • 重复上述步骤,直至字符串全部扫描完,如果扫描完以后栈为空说明分隔符是完全匹配的,栈不为空则说明分隔符不是完全匹配
  • 代码实现

    链栈linkStack的实现可以参考:https://blog.csdn.net/qq_52486831/article/details/120795153

    package linkStack;
    
    public class SignMatch {
    	// 判断表达式的左右分隔符是否匹配
    	public boolean signMatch(String str) throws Exception {
    		if (str != null && !"".equals(str)) {
    			boolean flag = true;
    			//我习惯使用链栈,使用顺序栈也是一样的
    			linkStack stack = new linkStack();		
    			for (int i = 0; i < str.length(); i++) {
    			//接受字符串对应位置的字符,方便后面进行字符串的拼接
    				char c = str.charAt(i);
    				String s = String.valueOf(c);
    				System.out.print(s+" ");
    				//扫描遇到空格直接跳过
    				if (" ".equals(s)) {
    					continue;
    				}
    				//特殊一点的分隔符有"",这两个分隔符长度为2,其余的分隔符长度都为1,所以要单独讨论,如果遇到要进行字符串的拼接,同时要跳过一个字符
    				if ("/".equals(s) && i < str.length() - 1 && "*" .equals (String.valueOf(str.charAt(i + 1)))) {
    					s = s.concat(String.valueOf(str.charAt(i + 1)));
    					++i;
    				} else if ("*".equals(s) && i < str.length() - 1 && "/" .equals (String.valueOf(str.charAt(i + 1)))) 
    					s = s.concat(String.valueOf(str.charAt(i + 1)));
    					++i;
    				}
    				if (isLeftSign(s)) {
    					System.out.print( "left ");
    					stack.push(s);
    				}
    				if (isRightSign(s)) {
    					System.out.print( "right ");
    					if(stack.isEmpty()||!match(stack.pop().toString(),s)){
    						flag = false;
    						break;
    					}
    				}
    			}
    			if (!stack.isEmpty())
    				flag = false;
    			return flag;
    		} else
    			throw new Exception("表达式为空");
    	}
    	// 判断是否是左分割符:{,(,[,
    		public boolean isRightSign(String str) {
    			boolean flag = false;
    			if (")".equals(str) || "]".equals(str) || "}".equals(str) || "*/".equals(str))
    				flag = true;
    			return flag;
    		}
    		
    	// 判断分隔符是否匹配
    	public boolean match(String left, String right) {
    		boolean flag = false;
    		if (("(".equals(left)&&")".equals(right)) || ("{".equals(left)&&"}".equals(right)) || ("[".equals(left)&&"]".equals(right)) || ("".equals(right)))
    			flag = true;
    		return flag;
    	}
    }
    

    提供的测试类如下:

    package linkStack;
    
    public class Demo_SignMatch {
    	
    	public static void main(String[] args) throws Exception{
    		SignMatch sign = new SignMatch();
    		String str1 = "(())abc{[)(]}";
    		if(sign.signMatch(str1)) {
    			System.out.println(str1 + "符号匹配");
    		}
    		else System.out.println(str1 + "符号不匹配");
    		String str2 = "(()))abc{[]}";
    		if(sign.signMatch(str2)) {
    			System.out.println(str2 + "符号匹配");
    		}
    		else System.out.println(str2 + "符号不匹配");
    		String str3 ="(()()abc{[]}";
    		if(sign.signMatch(str3)) {
    			System.out.println(str3 + "符号匹配");
    		}
    		else System.out.println(str3 + "符号不匹配");
    		String str4 ="(( ))abc{ []}";
    		if(sign.signMatch(str4)) {
    			System.out.println(str4 + "符号匹配");
    		}
    		else System.out.println(str4 + "符号不匹配");
    		String str5 ="/ */";
    		if(sign.signMatch(str5)) {
    			System.out.println(str5 + "符号匹配");
    		}
    		else System.out.println(str5 + "符号不匹配");
    		String str6 =" ";
    		if(sign.signMatch(str7)) {
    			System.out.println(str7 + "符号匹配");
    		}
    		else System.out.println(str7 + "符号不匹配");
    	}
    }
    

    代码中也可能存在部分问题或者有能够进一步优化的地方,本人也是编程菜鸟一枚,初学数据结构很有可能一些地方理解也有问题,希望大佬们能提出来批评指正

    转载请注明:文章转载自 www.mshxw.com
    本文地址:https://www.mshxw.com/it/327512.html
    我们一直用心在做
    关于我们 文章归档 网站地图 联系我们

    版权所有 (c)2021-2022 MSHXW.COM

    ICP备案号:晋ICP备2021003244-6号