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.
若你喜欢我的文章,欢迎关注
👇点赞
👇评论
👇收藏
👇 谢谢支持!!!