数据结构(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语句不合法!");
    }
}

posted on 2016-03-17 22:00  XLeer  阅读(1066)  评论(0编辑  收藏  举报

导航