zoukankan      html  css  js  c++  java
  • 数据结构(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语句不合法!");
        }
    }

  • 相关阅读:
    C语言的数据、常量和变量
    C语言关键字、标识符和注释
    关于C/C++的一些讨论
    C++ 复合类型(上)
    C 函数
    C 字符输入输出和输入确认
    C++数据处理
    C控制语句:分支与跳转
    C++ 预备知识#关于C++
    范型在java中的应用
  • 原文地址:https://www.cnblogs.com/xleer/p/5289661.html
Copyright © 2011-2022 走看看