首页 > 其他分享 >堆栈应用——括号匹配问题

堆栈应用——括号匹配问题

时间:2023-09-12 12:33:05浏览次数:32  
标签:Exception 匹配 top Object 括号 堆栈 public

堆栈是各种软件系统中应用最广泛的数据结构之一。括号匹配问题和表达式计算是编译软件中的基本问题,其软件设计中都需要用到堆栈。

【括号匹配问题】

  假设一个算术表达式中包含圆括号、方括号和花括号三种类型括号,编写一个判别表达式中括号是否正确匹配配对的函数,并设计一个测试主函数。

【设计分析】 括号匹配后到的括号要最先被匹配,满足堆栈“后进先出”的操作特点。

  括号匹配有以下4种情况:

  (1)左右括号配对次序不正确;

  (2)右括号多于左括号;

  (3)左括号多于右括号;

  (4)括号匹配正确。

  

【源代码】

SeqStackTest.java

1 package seqstack;
 2 
 3 public class SeqStackTest { 
 4     //遍历字符数组并利用进栈出栈匹配括号  
 5     static void expIsCorrect(String[] exp,int n)throws Exception{  
 6         SeqStack myStack = new SeqStack(100);  
 7         //LinStack myStack = new LinStack(); //也可以用链式堆栈  
 8         for(int i=0;i<n;i++){//如果是左括号就入栈  
 9             if((exp[i].equals(new String("(")))  
10                     || (exp[i].equals(new String("[")))  
11                     || (exp[i].equals(new String("{"))))  
12                 myStack.push(exp[i]);  
13             //如果是右括号)并且和栈顶(匹配,出栈  
14             else if((exp[i].equals(new String(")"))) && myStack.notEmpty()  
15                     && myStack.getTop().equals(new String("(")))  
16                 myStack.pop();  
17             //遍历的右括号)和栈顶不匹配,说明公式错误,结束遍历  
18             else if((exp[i].equals(new String(")"))) && myStack.notEmpty()  
19                     && !myStack.getTop().equals(new String("("))){  
20                 System.out.println("左右括号匹配次序不正确!");  
21                 return;  
22             }  
23             //如果是右括号]并且和栈顶[匹配,出栈  
24             else if((exp[i].equals(new String("]"))) && myStack.notEmpty()  
25                     && myStack.getTop().equals(new String("[")))  
26                 myStack.pop();  
27             //遍历的右括号]和栈顶不匹配,说明公式错误,结束遍历  
28             else if((exp[i].equals(new String("]"))) && myStack.notEmpty()  
29                     && !myStack.getTop().equals(new String("["))){  
30                 System.out.println("左右括号匹配次序不正确!");  
31                 return;  
32             }  
33             //如果是右括号}并且和栈顶{匹配,出栈  
34             else if((exp[i].equals(new String("}"))) && myStack.notEmpty()  
35                     && myStack.getTop().equals(new String("{")))  
36                 myStack.pop();  
37             //遍历的右括号}和栈顶不匹配,说明公式错误,结束遍历  
38             else if((exp[i].equals(new String("}"))) && myStack.notEmpty()  
39                     && !myStack.getTop().equals(new String("{"))){  
40                 System.out.println("左右括号匹配次序不正确!");  
41                 return;  
42             }  
43             //如果栈已空,但还存在右括号,说明右括号多了  
44             else if((exp[i].equals(new String(")")))  
45                     || (exp[i].equals(new String("]")))  
46                     || (exp[i].equals(new String("}")))  
47                     && !myStack.notEmpty()){  
48                 System.out.println("右括号多余左括号!");  
49                 return;  
50             }  
51         }  
52         //遍历完成后栈内还有元素,说明左括号多了  
53         if(myStack.notEmpty())  
54             System.out.println("左括号多余右括号!");  
55         else  
56             System.out.println("括号匹配正确!");  
57     }  
58       
59     private static String[] strToString(String str){//把字符串转换为String类型数组  
60         //为什么不转换为字符数组char[]呢?  
61         //因为只有String类型的数据才具有可比性,也就是能用equals  
62         int n = str.length();  
63         String[] a = new String[n];  
64         for(int i=0;i<n;i++){  
65             a[i] = str.substring(i,i+1);//取子串含头不含尾,故可以取出i位置的字符并返回字符串类型  
66         }  
67         return a;  
68     }  
69       
70     public static void main(String[] args) {  
71         String str;  
72         int n;  
73         try{  
74             str = "(())abc{[}(){";//左右括号匹配次序不正确  
75             n = str.length();  
76             String[] a = strToString(str);  
77             expIsCorrect(a,n);  
78               
79             str = "(()))abc{[]}";//右括号多余左括号  
80             n = str.length();  
81             String[] b = strToString(str);  
82             expIsCorrect(b,n);  
83               
84             str = "(()()abc{[]}";//左括号多余右括号  
85             n = str.length();  
86             String[] c = strToString(str);  
87             expIsCorrect(c,n);  
88               
89             str = "(())abc{[]}";//括号匹配正确!  
90             n = str.length();  
91             String[] d = strToString(str);  
92             expIsCorrect(d,n);  
93         }  
94         catch(Exception e){  
95             System.out.println(e.getMessage());  
96         }  
97   
98     }  
99 }

 

Stack.java

1 package seqstack;
2 
3 public interface Stack {
4     public void push(Object obj)throws Exception;
5     public Object pop()throws Exception;
6     public Object getTop()throws Exception;
7     public boolean notEmpty();
8 }

 

SeqStack.java

package seqstack;

public class SeqStack implements Stack{
    final int defaultSize=10;
    int top;
    Object[] stack;
    int sizeMaxSize;
    
    public SeqStack(int sz)
    {
        initiate(sz);
    }

    private void initiate(int sz) {
        // TODO Auto-generated method stub
        sizeMaxSize=sz;
        top=0;
        stack=new Object[sz];
    }
    
    public void push(Object obj)throws Exception{
        if(top == sizeMaxSize)
        {
            throw new Exception("堆栈已满!");
        }
        stack[top] = obj;
        top++;
    }
    
    public Object pop()throws Exception{
        if(top == 0)
        {
            throw new Exception("堆栈已空!");
        }
        top--;
        return stack[top];
    }
    
    public Object getTop()throws Exception{
        if(top == 0)
        {
            throw new Exception("堆栈已空!");
        }
        return stack[top-1];
    }
    public boolean notEmpty(){
        return(top>0);
    }
    
    
}

 

【运行结果】

堆栈应用——括号匹配问题_括号匹配

 

标签:Exception,匹配,top,Object,括号,堆栈,public
From: https://blog.51cto.com/u_14682436/7444340

相关文章

  • 括号匹配问题
    1.题目设表达式中包含三种括号:圆括号、方括号和花括号,它们可互相嵌套,如({})或({([][()])})等均为正确的格式,而{[])}、{()]或([]}均为不正确的格式。2.算法分析3.////Createdbytrmbhon2023-09-11.//#include<stdio.h>#include<stdlib.h>#include<string.h>#define......
  • 想跳出Android内卷困境,简历匹配上大厂你需要做到那些
    内卷化是一个近年来在中文网络上经常出现的词汇,通常用来描述某个领域中过度的竞争和内部消耗。这个概念直观地说就是“向内演化”,更广泛地说,所有没有实质意义的消耗都可以称为内卷。在生活中,许多看似精益求精的重复工作,实际上是在内部范围内施展,而不是向外扩张,这也可以被视为内卷的......
  • 使用方括号方法取动态对象名
    前两天工作中需要这个需求,切换的时候选中的数据列表是动态变化的,就用[]方括号法取当前选中值的对象用的是elementui的radio和table组成的,上面是标签下面是标签下的table因为el-radio的样式和界面有一点出入修改样式也麻烦,自己组合写了一个,效果图类似下面这种<el-radio-groupv-mod......
  • windows系统上docker配置redis闪退以及版本匹配问题
    安装镜像首先,在windows命令行安装指定版本的redis镜像:dockerpull<image_name>:<version>除此之外,因为docker安装运行redis容器,是没有配置文件的,需要自己手动创建一个 redis.conf 文件。redis.conf文件的获取最好从github官网中找。将conf文件一下参数进行调整:bind......
  • delphi FireDAC 调用 Execute 提示 `[FireDAC][SQL Server Native Client 10.0]字符串
    FireDAC调用Execute提示[FireDAC][SQLServerNativeClient10.0]字符串数据,长度不匹配错误问题调用Execute向SQLServer数据库中批量插入数据时,参数中有BLOB数据类型(ftBlob、ftMemo等)时,出现[FireDAC][Phys][ODBC][Microsoft][SQLServerNativeClient10.0]字符串......
  • 正则中常见的4种匹配模式
    所谓匹配模式,指的是正则中一些改变元字符匹配行为的方式,比如匹配时不区分英文字母大小写。常见的匹配模式有4种,分别是不区分大小写模式、点号通配模式、多行模式和注释模式。1、不区分大小写模式(Case-Insensitive)当我们把模式修饰符放在整个正则前面时,就表示整个正则表达式都是不......
  • FuzzyWuzzy:模糊字符串匹配工具包
    在日常开发工作中,经常会遇到这样的一个问题:要对数据中的某个字段进行匹配,但这个字段有可能会有微小的差异。比如同样是招聘岗位的数据,里面省份一栏有的写“广西”,有的写“广西壮族自治区”,甚至还有写“广西省”……为此不得不增加许多代码来处理这些情况。今天跟大家分享FuzzyWuz......
  • linux 中 awk命令实现文件按列精确匹配合并
     001、[root@pc1test01]#cata.txtA:10B:5C:12[root@pc1test01]#catb.txt100A50B88K99Y42C[root@pc1test01]#awk'{if(NR==FNR){ay[$1]=$2}else{print$2,$1,ay[$2]}}'FS=":"a.txtFS=""b.txtA10010......
  • linux 中 awk命令实现文件按列匹配
     001、方法1[root@pc1test01]#lsa.txtb.txt[root@pc1test01]#cata.txtA:10B:5C:12[root@pc1test01]#catb.txt100A50B42C[root@pc1test01]#awk-F"[:]"'{if(NR==FNR){ay[$1]=$2}else{print$2,$1,ay[$2]}}'a.txtb......
  • 字符串匹配算法
    #include<stdio.h>#defineMaxSize100//定义typedefstruct{charch[MaxSize];intlength;}SString;//朴素模式匹配算法,主串S,辅串T,最坏时间复杂度:O(mn)intIndex(SStringS,SStringT){inti=1,j=1;while(i<=S.length&&j<=T.length){......