java中栈的应用-判断分隔符是否合理

栈是软件系统应用最广泛的数据结构之一,只要涉及先进后出的处理特征都可以使用栈结构。

例如:函数递归调用中的地址和参数值的保存,文本编辑器中序列的保存,在编译软件设计中的括号匹配及表达式求值,网页访问历史的记录保存

下面通过讨论及格栈式结构的具体应用来说明栈在解决实际问题中的运用:

(一)判断分隔符是否合理

算法如下:

从左到右扫描java语句,不断读出java字符,若读出为左字符,则将其写入栈中,若读出为右字符,则将栈中左字符pop出并匹配,若不匹配或者没有左字符与右字符匹配,

则程序报错

把java语句读完后,若栈仍不为空,(没有右字符与栈中左字符匹配),则程序报错;若栈为空,则表示程序正常


import java.util.Scanner;
import java.util.Stack;


//判断分隔符匹配问题
public class Example3_1 {
	private final int LEFT=0;
	private final int RIGHT=1;
	private final int OTHER=2;
	//判断分隔符类型,有左,右,不合法三红类型
	public int verifyFlag(String str){
		if("(".equals(str)||"[".equals(str)||"{".equals(str)||"/*".equals(str))
			{return LEFT;}
		else if(")".equals(str)||"]".equals(str)||"}".equals(str)||"*/".equals(str)){
			return RIGHT;
		}
		else
			return OTHER;
	}
	//判断左右分隔符是否匹配
	public boolean match(String str1,String str2){
		if("(".equals(str1)&&")".equals(str2)||"[".equals(str1)&&"]".equals(str2)||
				"{".equals(str1)&&"}".equals(str2)||"/*".equals(str1)&&"*/".equals(str2)){
			return true;
			
		}
		else
			return false;
	}
	//判断左右分隔符是否匹配
	public boolean isLegal(String str) throws Exception{
		if(!"".equals(str)&&str!=null){
			//新建最大储存空间为100的顺序栈
			Stack<String> stack=new Stack<>();	
			int length=str.length();
			//判断是否为/* 或者*/,如果是将其放入t中
			for(int i=0;i<length;i++){
				char c=str.charAt(i);//将索引到的元素转换为char类型
				String t=String.valueOf(c);//将char类型转换为String类型
				if(i!=length){
					if(('/'==c&&'*'==str.charAt(i+1))||'*'==c&&'/'==str.charAt(i+1)){
						t=t.concat(String.valueOf(str.charAt(i+1)));//将其连接成String类型
						++i;
			          }
					}
				if(LEFT==verifyFlag(t)){
				 stack.push(t); //如果为左分隔符,则放入栈中
			}
				else if(RIGHT==verifyFlag(t)){
					//如果为右分隔符
					if(stack.isEmpty()||!match(stack.pop(), t)){
						throw new Exception("错误,java语句不合法");
					}
				}
				
			}if(!stack.isEmpty()){
				throw new Exception("错误,java语句不合法");
			}
			return true;
			}
		else throw new Exception("错误,java语句为空");
			}
		

	

	public static void main(String[] args) throws Exception {
		// TODO Auto-generated method stub
		Example3_1 e=new Example3_1();
		System.out.println("请输入java语句");
		Scanner sc=new Scanner(System.in);
		if(e.isLegal(sc.nextLine())){
			System.out.println("java语句合法");
		}else
			System.out.println("java语句不合法");
	}

}
运行结果如下:

请输入java语句
a=(a+c(d*e)*f+sa;
Exception in thread "main" java.lang.Exception: 错误,java语句不合法
	at stack.Example3_1.isLegal(Example3_1.java:59)
	at stack.Example3_1.main(Example3_1.java:74)

请输入java语句
a+(c+d)*d
java语句合法



  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值