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

转载于:https://www.cnblogs.com/xleer/p/5289661.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/288618.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

sql LEFT JOIN RIGHT JOIN(左连接)(mysql)

我们首先来看我们的两个表&#xff1a; table1: table2: 在这里&#xff0c;LEFT JOIN&#xff08;内连接,或等值连接&#xff09;&#xff1a;取得左表&#xff08;table1&#xff09;完全记录&#xff0c;即是右表&#xff08;table2&#xff09;并无对应匹配记录。 …

linux shell之xargs 、tr、sha1sum、head、tail一般使用

1 xargs命令 有点类似-exec命令 1&#xff09;删除当前目录下面的c文件 find . -name "*.c" | xargs rm 2&#xff09;统计当前c文件里面的代码行数 find . -name "*.c" | xargs wc -l 2 tr命令 替换命令 1&#xff09;把大小替换成小写 echo &quo…

php的_auto,AutoPHPCheck下载

AutoPHPCheck官方版是一款相当优秀的php开发人员专用PHP验证工具&#xff0c;AutoPHPCheck官方版功能全面&#xff0c;便捷好用&#xff0c;支持执行快速验证来帮助您确保代码的安全性&#xff0c;并且软件还附带了一个基本的语法检查器&#xff0c;可以查找并帮助您处理错误。…

python0表示剪刀_石头,纸,剪刀Python代码。帮助简化

我是Python新手&#xff0c;只写过几个程序。这是我最近为一个“石头剪子”游戏编写的代码。我已经测试过了&#xff0c;效果很好。有什么方法可以简化它吗&#xff1f;谢谢&#xff01;import randomwins0losses0ties0rounds0r1 #rockp2 #papers3 #scissorsy "The compu…

Google图片加载库Glide的简单封装GlideUtils

Google图片加载库Glide的简单封装GlideUtils

【ArcGIS遇上Python】Python实现点转栅格(PointToRaster)

在ArcGIS中提供了点转栅格(PointToRaster)的工具,如下所示: 参数说明: (1)file:点图层(.shp) (2)data:值字段 (3)outFile:转换后的栅格图层 (4)9660.848118:空间分辨率 python批处理代码: import arcpy arcpy.gp.overwriteOutput=1 arcpy.env.workspace=&…

ASP.NET Core认证授权方案

前言在前面我讲过基于token的权限认证&#xff0c;然后前几天有小伙伴私信我&#xff0c;怎么做一个身份认证也就是授权。在Asp.net Core常见的授权方式有:基于角色的授权&#xff0c;有基于声明的授权&#xff0c;有基于策略的授权&#xff0c; 这三种授权我就不做过多介绍了,…

linux基础知识个人总结

linux基础知识个人总结第一章&#xff1a;1. Linux发展史略&#xff0c;有代表性的Linux发行版&#xff1a;Suse、slackware、ubuntu、RedHat、CentOS2. GNU是Richard Stallman在1983年发起的一项自由软件运动&#xff0c;目标是为了创建一套完全自由的操作系统&#xff0c;它要…

linux shell之pushd、popd、dirs

1 问题 我们有时候需要保存多个路径&#xff0c;上下键切换不方便&#xff0c;用cd-只能到上个目录&#xff0c;我们可以用dirs和pushd和popd 2 dirs、pushd、popd dirs: 这个命令显示栈里面所有的路径&#xff0c;一定会包含当前路径,常用参数如下 dirs -v 显示栈里面的所有…

插入排序—直接插入排序(Straight Insertion Sort)

基本思想: 将一个记录插入到已排序好的有序表中&#xff0c;从而得到一个新&#xff0c;记录数增1的有序表。即&#xff1a;先将序列的第1个记录看成是一个有序的子序列&#xff0c;然后从第2个记录逐个进行插插入到已入&#xff0c;直至整个序列有序为止。 要点&#xff1a;设…

SQL UNION 和 UNION ALL 操作符(mysql)

首先看两个表&#xff1a; table1: table2: 如果我们要查询table1表和 table2表中的 name1的值&#xff0c;但是不存在重复的值一起输出出来&#xff0c;那么就可以用union操作符&#xff1a; SELECT name1 FROM table1 UNION SELECT name1 FROM table2 结果我们会查…

redis php方案,Redis三种部署方案图文详解

standaloan(单机模式)standaloan 是redis单机模式&#xff0c;及所有服务连接一台redis服务&#xff0c;该模式不适用生产。如果发生宕机&#xff0c;内存爆炸&#xff0c;就可能导致所有连接改redis的服务发生缓存失效引起雪崩。(推荐&#xff1a;redis视频教程)ssentinel(哨兵…

【ArcGIS遇上Python】Python版的ArcGIS栅格计算器模板

python编写的栅格计算器&#xff0c;用于批处理。 import arcpy from arcpy.sa import * arcpy.CheckOutExtension("spatial") arcpy.gp.overwriteOutput1#custom arcpy.env.workspace"G:\\Phenology of 30 Years\\GIMMS 3g\\15Length\\1Length\\" #custo…

抛开flash,自己开发实现C++ RTMP直播流播放器

众所周知&#xff0c;RTMP是以flash为客户端播放器的直播协议&#xff0c;主要应用在B/S形式的场景中。本人研究并用C开发实现了RTMP直播流协议的播放器&#xff0c;结合之前做的RTMP直播采集端&#xff0c;可以将RTMP协议完全扩展到C/S形式的应用场景中&#xff0c;这将对之后…

python用户输入若干个分数_编写一个程序,要求用户输入五个测试分数。与字母grad对应...

Determine_grade-接受单个数字作为参数&#xff0c;并根据以下评分标准显示分数的字母等级&#xff1a;Score 90-100 80-89 70-79 60-69 Below 60Letter Grade ABCDFcalc_average-以分数列表作为参数&#xff0c;显示分数的平均值&#xff0c;以及与该平均值相等的字母分数。ma…

.NET 程序读取当前目录避坑指南

前些天有 AgileConfig 的用户反映&#xff0c;如果把 AgileConfig 部署成 Windows 服务程序会启动失败。我看了一下日志&#xff0c;发现根目录被定位到了 C:\Windows\System32 下&#xff0c;那么读取 appsettings.json 配置文件自然就失败了。var builder new Configuration…

linux之sed命令

1 sed命令(stream edit) 我们一般用来替换文件内容 2 常用方法 1)、比如一般用sed命令替换文件内容&#xff0c;这里参数-i的意思是操作后直接保存在file里面去了 sed -i s/pattern/replace_str/ file 比如我们把sed.txt文件里面的chenyu替换成chen cat sed.txt chenyu ch…

Liststring[] 如何去重

List<string[]> 如何去重&#xff0c;代码如下: static void Main(string[] args){List<string[]> list new List<string[]>();list.Add(new string[] { "1", "2", "3" });list.Add(new string[] { "1" });list.Ad…

sql create,not null 简单用法(mysql)

sql中CREATE用于创建&#xff0c;一般所说的CREATE DATABASE dbname就是创建数据库&#xff0c;那么dbname我们换成我们所要创建的数据库名称即可。 例如创建一个test数据库&#xff1a; CREATE DATABASE test 创建一个表&#xff1a; CREATE TABLE TableName ( 数据库列…

【译】《Understanding ECMAScript6》- 第三章-Object

目录 Object分类Object字面量扩展Object.assign()重复属性改变原型super引用方法总结ES6针对Object的改进&#xff0c;旨在使JavaScript语言更加接近“万物皆对象”的理念。随着越来越多地使用Object类型进行开发&#xff0c;开发者们越来越不满足于Object相对低下的开发效率。…