我正在阅读 第二版算法设计手册 ,这是一个练习题。引用问题
编译器和文本编辑器的一个常见问题是确定字符串中的括号是否平衡并正确嵌套。例如,字符串(((())())()包含正确嵌套的括号对,字符串)()(和())则没有。如果字符串包含正确嵌套且平衡的括号,则给出一种返回true的算法,否则返回false。为了获得完整的信誉,如果字符串未正确嵌套和平衡,请确定第一个有问题的括号的位置。
问题在堆栈,队列和列表类别下。这是我用C#编写的内容。
const char LeftParenthesis = '('; const char RightParenthesis = ')'; bool AreParenthesesBalanced(string str, out int errorAt) { var items = new Stack<int>(str.Length); errorAt = -1; for (int i = 0; i < str.Length; i++) { char c = str[i]; if (c == LeftParenthesis) items.Push(i); else if (c == RightParenthesis) { if (items.Count == 0) { errorAt = i + 1; return false; } items.Pop(); } } if (items.Count > 0) { errorAt = items.Peek() + 1; return false; } return true; }
这很好。但是我不确定这是否是解决此问题的正确方法。任何更好的想法都欢迎。
我认为这是目的,但实际上,如果仅处理括号,则只需要减少和增加计数器。如果要处理方括号,尖括号,花括号或您要使用的任何字符配对,那么您将需要像完成操作一样使用堆栈。
您还可以使用列表,反复打开head元素,但是实际上无论如何堆栈都可以实现为列表-至少在ocaml中。