以下文字摘自《数据结构与算法分析 C语言描述》
编译器检查程序的语法错误,但是常常由于缺少一个符号(如遗漏一个花括号或注释起始符)引起编译器列出上百行的诊断,而真正的错误并没有找出。
在这种情况下,可以使用一个程序来检验是否每个符号都成对出现。于是,每一个右花括号、右方括号及右圆括号必然对应其相应的左括号。序列 “[()]” 是合法的,但 “[()]” 是错误的。显然,不值得为此编译一个大型程序,事实上检验这些事情是很容易的。为简单起见,我们仅就圆括号、方括号、和花括号进行检验并忽略出现的任何其他字符。
这个简单的算法用到一个栈,叙述如下:
二、实现 做一个空栈。读入字符直到文件尾。如果字符是一个开放符号,则将其推入栈中。如果字符是一个封闭符号,则当栈空时报错;否则,将栈元素弹出。如果弹出的符号不是对应的开放符号,则报错。在文件尾,如果栈非空则报错。
需要用到的栈的基本ADT都已经完成了,重点是如何判断一对括号。我的方法是ASCII码判断,如果左右两个括号的ASCII码加起来是81、184或248,那么它们就是一对括号。
#include#include #include "stack_array.h" #define max_element 20 #define fatal_error(str) fprintf(stderr, "%sn", str), exit(EXIT_FAILURE) int main(void) { FILE *file; int ch; char *file_path = "/home/pineapple/codes/c-project/dsaa/stack/balance_symbol.txt"; if ((file = fopen(file_path, "r")) == NULL) fatal_error("File is not exist!"); Stack stack = StackInit(max_element); // Traverse file characters while ((ch = getc(file)) != EOF) { if (ch == '{' || ch == '[' || ch == '(') StackPush(stack, ch); else { int top = StackTopAndPop(stack); int sum = top + ch; // '(' + ')' = 81, '[' + ']' = 184, '{' + '}' = 248 if (sum == 81 || sum == 184 || sum == 248) continue; else fatal_error( "Fatal error: symbol is not balance."); } } if (!StackIsEmpty(stack)) fatal_error("Fatal error: stack is not empty."); StackDispose(stack); fclose(file); return EXIT_SUCCESS; }
具体的栈ADT就不列出了,详细代码在https://github.com/james-wangx/dsaa/tree/master/stack
情况可以分为四种:
{[()]}:检验正常,没有任何输出
{[(]]}:非平衡符号,输出
Fatal error: symbol is not balance.
{[()]}}:右括号多于左括号,输出
Stack is empty. Fatal error: symbol is not balance.
{{[()]}:左括号多余右括号,输出
Fatal error: stack is not empty.
若你喜欢我的文章,欢迎关注点赞评论收藏 谢谢支持!!!



