zoukankan      html  css  js  c++  java
  • 堆栈应用——括号匹配问题

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

    【括号匹配问题】

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

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

      括号匹配有以下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);
        }
        
        
    }

    【运行结果】

  • 相关阅读:
    Fedora 12/Debian 以root登录图形界面
    贡献一个简单的日志类
    "没有 pthread_create 的手册页条目"解决办法
    OpenBSD 下架设vsftpd
    NetSnmp初步(一):让我们的程序提供snmp服务
    linux socket接收、发送小工具(支持tcp、udp包(组播)的发送接收)
    NetSnmp初步(二):发送Notification
    netbeans添加现有源文件时自动更新Makefile依赖关系
    Fedora Core12的防火墙会过滤掉部分IP数据包,在开发调试时建议关闭防火墙
    NetSnmp初步(三):接收控制命令:实现SNMP的SET命令
  • 原文地址:https://www.cnblogs.com/liao-pxsoftware15/p/8681203.html
Copyright © 2011-2022 走看看