栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C语言 用栈检验平衡符号

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C语言 用栈检验平衡符号

一、概述

以下文字摘自《数据结构与算法分析 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.

若你喜欢我的文章,欢迎关注点赞评论收藏 谢谢支持!!!

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/768440.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号