C语言 用栈检验平衡符号
一、概述
以下文字摘自《数据结构与算法分析 C语言描述》
编译器检查程序的语法错误,但是常常由于缺少一个符号(如遗漏一个花括号或注释起始符)引起编译器列出上百行的诊断,而真正的错误并没有找出。
在这种情况下,可以使用一个程序来检验是否每个符号都成对出现。于是,每一个右花括号、右方括号及右圆括号必然对应其相应的左括号。序列 “[()]” 是合法的,但 “[()]” 是错误的。显然,不值得为此编译一个大型程序,事实上检验这些事情是很容易的。为简单起见,我们仅就圆括号、方括号、和花括号进行检验并忽略出现的任何其他字符。
这个简单的算法用到一个栈,叙述如下:
做一个空栈。读入字符直到文件尾。如果字符是一个开放符号,则将其推入栈中。如果字符是一个封闭符号,则当栈空时报错;否则,将栈元素弹出。如果弹出的符号不是对应的开放符号,则报错。在文件尾,如果栈非空则报错。
二、实现
需要用到的栈的基本ADT都已经完成了,重点是如何判断一对括号。我的方法是ASCII码判断,如果左右两个括号的ASCII码加起来是81、184或248,那么它们就是一对括号
。
/** * @file balance_symbol.c * @date 2022-03-16 * @author James Wang (pineapple_cpp@163.com) * * @brief Stack application -- balance symbol */ #include <stdio.h> #include <stdlib.h> #include "stack_array.h" #define max_element 20 #define fatal_error(str) fprintf(stderr, "%s\n", 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.
若你喜欢我的文章,欢迎关注
👇点赞
👇评论
👇收藏
👇 谢谢支持!!!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具