栈的应用

     最近看了数据结构与算法分析这本书,感觉书的质量很高,作者是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)"));
    }
}

思路很简单!

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

posted @ 2017-01-12 21:35  深蓝至尊  阅读(268)  评论(0编辑  收藏  举报