• 栈的应用


         最近看了数据结构与算法分析这本书,感觉书的质量很高,作者是Mark Allen Weiss。推荐大家看一下!里面数据结构的原理讲的很易懂,书中的代码经过我实践,也是切实可行的,是一本良心之作!

         之前博客中的那几篇数据结构的实现,就是来源于这本书!下面我们来说说栈的应用吧!

         毫不奇怪,如果我们把操作限制在一张表上,那么这些操作会执行得很快。然而,令人奇怪的是,这些少量的操作非常强大和重要。下面给出两个例子作为参考!

        一.平衡符号

            编译器检查程序的语法错误,但是常常由于缺少一个符号引起编译器列出上百行的诊断,而真正的错误并没有找出。

            在这种情况下,一个有用的工具就是检验是否每件事情都能成对的程序。于是,每一个右花括号,右方括号及右圆括号必然对应其相应的左括号。序号[()]是合法的,但是[(])是错误的。显然,不值得为此写一个大型程序,事实上检验这些事情是很容易的。为简单起见,我们仅就圆括号,方括号和花括号进行检验并忽略出现的任何其他字符。

          这个简单的算法用到一个栈,叙述如下:

              做一个空栈。读入字符直到文件结尾。如果字符是一个开放符号,则将其推入栈中。如果字符是一个封闭符号,则当栈空时报错。否则,将栈元素弹出。如果弹出的符号不是对应的开放符号,则报错。在文件结尾,如果栈空则报错。

    就是说遇到'{','[','('则进行入栈的操作。遇到字符忽略,遇到'}',']',')'在判断是不是对应的左括号,如果不是则报错,或者栈空就报错!

         一下是我自己写的一个简单的程序 ,仅供参考:

        

    public class StackUtil {
    
        /**
         * 栈对于括号的匹配的判断
         * @param str
         */
        public static Boolean isMatchBracket(String str){
            Stack<Character> stack = new Stack<Character>();
            char[] chars =  str.toCharArray();
            for(char c:chars){
                switch (c){
                    case '{':stack.push(c);break;
                    case '[':stack.push(c);break;
                    case '(':stack.push(c);break;
                    case '}':
                        if(stack.size()==0||!stack.pop().equals('{'))return false;
                        break;
                    case ']':
                        if(stack.size()==0||!stack.pop().equals('['))return false;
                        break;
                    case ')':
                        if(stack.size()==0||!stack.pop().equals('('))return false;
                        break;
                    default:break;
                }
            }
            return stack.size()==0?true:false;
        }
    
    
        public static void main(String[] args) {
            System.out.println(isMatchBracket("(9+0)+(8-0)"));
        }
    }

    思路很简单!

    下一节将会讲后缀表达式的应用,中缀转后缀,进行表达式的计算。。。。。

  • 相关阅读:
    【随笔】新博客
    【Linux】grep命令
    【C/C++】C++11 Move, Forward
    【C/C++】C++11 Variadic Templates
    【C/C++】C++11 Lambda
    【Linux】gdb调试
    【C/C++】数组 & 指针
    【PAT】反转链表
    【OS】Process & Thread
    【Python】Scrapy基础
  • 原文地址:https://www.cnblogs.com/shenlanzhizun/p/6279913.html
Copyright © 2020-2023  润新知