栈是软件系统应用最广泛的数据结构之一,只要涉及先进后出的处理特征都可以使用栈结构。
例如:函数递归调用中的地址和参数值的保存,文本编辑器中序列的保存,在编译软件设计中的括号匹配及表达式求值,网页访问历史的记录保存
下面通过讨论及格栈式结构的具体应用来说明栈在解决实际问题中的运用:
(一)判断分隔符是否合理
算法如下:
从左到右扫描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语句合法