数据结构(java语言描述)顺序栈的使用
1.声明Istack接口;
package stack;
public interface Istack {
public void clear();
public boolean isEmpty();
public int length();
public Object peek();
public void push(Object x) throws Exception;
public Object pop();
}
2.实现栈的类
package stack;
public class sqstack implements Istack {//非抽象类要实现接口的所有方法
private Object[] data;
private int top;
public sqstack(int maxsize){//初始化一个最大存储空间为maxsize大小栈
top=0;
data=new Object[maxsize];
}
//清空栈
public void clear(){
top=0;
}
//判空
public boolean isEmpty(){
return top==0?true:false;
}
//返回栈的长度
public int length(){
return top;
}
//返回栈顶元素
public Object peek(){//当方法定义返回值为某个类型时,方法中要返回某个值或者null(0 1/true false)
if(!isEmpty()){
return data[top-1];
}else{
return null;
}
}
//入栈操作
public void push(Object x) throws Exception{
if(top==data.length)
throw new Exception("栈已满!");
else
data[top++]=x;
}
public Object pop(){
if(isEmpty())
return null;
else
return data[--top];//出栈,同是top--
}
}
3.算法
package stack;
import java.util.Scanner;
public class st1 {
/**********************************************************
* *****分配符匹配问题:编写java语句中分隔符是否匹配的程序*********
**********************************************************/
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 matches(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;
}
//判断输入的字符串是否合法
private boolean isLegal(String str)throws Exception{
if(!"".equals(str)&&str!=null){//如果输入的字符串不是空串,也不在串尾
sqstack s=new sqstack(100);
int length=str.length();//返回字符串的长度
for(int i=0;i<length;i++){//对输入的字符串进行遍历
char c=str.charAt(i);
String t=String.valueOf(c);
//判断str中是否有/* 或*/存在,若存在则作为一个字符串
if(i!=length){
if(('/'==c&&'*'==str.charAt(i+1))||
'*'==c&&'/'==str.charAt(i+1)){
t=t.concat(String.valueOf(str.charAt(i+1)));
++i;
}
}
//将分割后的所有字符串分别与左、右、其它三种符号比较
if(left==verifyFlag(t)){
s.push(t);//字符串时左则入栈
}else if(right==verifyFlag(t)){
if(s.isEmpty()||!matches(s.pop().toString(),t)){//是右则判断栈是否为空或者栈顶元素是否与该字符串匹配
//System.out.println("!matches(s.pop().toString(),t):"+!matches(s.pop().toString(),t));
throw new Exception("错误:java语法不合法!");//不能匹配则抛出异常
}
}
}//for循环遍历整个java语句
if(!s.isEmpty()){//匹配结束,若栈不为空则str有误,抛出异常
throw new Exception("错误:java语句不合法!");
}//
return true;
}else{//大if 判断str ("".equals(str)||str=null)语句为空
throw new Exception("错误:java语句为空!");
}
}
public static void main(String[] args) throws Exception{
st1 e=new st1();
System.out.println("请输入分java语句:");
Scanner sc=new Scanner(System.in);
if(e.isLegal(sc.nextLine()))
System.out.println("java语句合法");
else
System.out.println("错误:java语句不合法!");
}
}