最近看了数据结构与算法分析这本书,感觉书的质量很高,作者是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)")); } }
思路很简单!
下一节将会讲后缀表达式的应用,中缀转后缀,进行表达式的计算。。。。。