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语句不合法!");
        }
    }

  • 相关阅读:
    剑指Offer-30.连续子数组的最大和(C++/Java)
    剑指Offer-29.最小的K个数(C++/Java)
    UVA 1616 Caravan Robbers 商队抢劫者(二分)
    UVA 10570 Meeting with Aliens 外星人聚会
    UVA 11093 Just Finish it up 环形跑道 (贪心)
    UVA 12673 Erratic Expansion 奇怪的气球膨胀 (递推)
    UVA 10954 Add All 全部相加 (Huffman编码)
    UVA 714 Copying Books 抄书 (二分)
    UVALive 3523 Knights of the Round Table 圆桌骑士 (无向图点双连通分量)
    codeforecs Gym 100286B Blind Walk
  • 原文地址:https://www.cnblogs.com/xleer/p/5289661.html
Copyright © 2011-2022 走看看