数据结构与算法分析(C语言描述)(九)栈的应用——平衡符号

/*
Check if parenthesis ( ), brackets [ ], and braces { } are balanced.
栈的应用————平衡符号
*/

/*
栈的两种实现方式:链式存储和顺序存储(数组)。栈的一个主要应用是平衡符号。
初学者在编写代码并且编译时,难免会因为少写了一个')'和被编译器报错。也就
是说,编译器会去匹配括号是否匹配。当你输入了一个'(',很自然编译器回去检
查你是否有另一个')'符号与之匹配。如果所有的括号都能够成对出现,那么编译
器是能够通过的。否则编译器会报错。例如字符序列“(a+b)”是匹配的,而字符序
列"(a+b]"则不是。
在检测括号匹配的算法中使用到了栈.

算法描述如下:创建一个空栈,读取字符序列直到结尾。如果字符是开放符号
'(''[''{',将其入栈;如果是一个封闭符号')'']''}',则当栈为空时报错。
否则,将栈顶元素弹出。如果弹出的符号不是对应的开放符号,则报错。当字
符序列结束,判断栈是否为空,为空则报错。
*/
#include <stdio.h>  
#include <stdlib.h>  
#define ElementType char 

struct Node;
typedef struct Node *PtrToNode;
typedef PtrToNode Stack;
typedef struct Node
{
	ElementType Element;
	PtrToNode Next;
};
/*
//栈的链表实现-方法二
struct Node {
	char Element;
	struct Node *next;
};//栈的链表实现
typedef struct Node *Stack;
*/
int IsEmpty(Stack S);
Stack CreateStack();
void DisposeStack(Stack S);
void MakeEmpty(Stack S);
void Push(ElementType X, Stack S);
ElementType Top(Stack S);
void Pop(Stack S);
void DisposeStack(Stack S);
void CheckSymbol(char *ch, Stack S);

//判断栈是否为空  
int IsEmpty(Stack S)
{
	return S->Next == NULL;
}
//创建链栈  
Stack CreateStack(void)
{
	Stack S;
	S = malloc(sizeof(struct Node));
	if (S == NULL)
	{
		printf("No enough memory!");
		return NULL;
	}
	S->Next = NULL;
	MakeEmpty(S);
	return S;
}

void MakeEmpty(Stack S)
{
	if (S == NULL)
	{
		printf("Use CreateStack First!");
	}
	else
	{
		while (!IsEmpty(S))
		{
			Pop(S);
		}
	}
}

void Push(ElementType X, Stack S)
{
	PtrToNode TmpCell;
	TmpCell = malloc(sizeof(struct Node));
	if (TmpCell != NULL)
	{
		TmpCell->Element = X;
		TmpCell->Next = S->Next;
		S->Next = TmpCell;
	}
	else
	{
		printf("Out of space!");
	}
}

void Pop(Stack S)
{
	PtrToNode FirstCell;

	if (IsEmpty(S))
	{
		printf("The Stack is Empty!");
	}
	else
	{
		FirstCell = S->Next;
		S->Next = FirstCell->Next;
		free(FirstCell);
	}
}

ElementType Top(Stack S)
{
	if (IsEmpty(S))
	{
		printf("The stack is empty!");
		return 0;
	}
	else
	{
		return S->Next->Element;
	}
}
void DisposeStack(Stack S)
{
	if (S == NULL)
		printf("no stack");
	MakeEmpty(S);
	free(S);
}

//平衡符号判断  
void CheckSymbol(char *ch, Stack S)
{
	printf("%s\n", ch);
	ElementType c;
	MakeEmpty(S);
	while ((c = *ch) != '\0')
	{
		switch (c)
		{
			case '(':
			case '[':
			case '{':
				Push(c, S);
				break;
			case ')':
				if (IsEmpty(S))
				{
					fprintf(stderr, "The symbols not balance!\n");
					return;
				}
				else
				{
					if (Top(S) == '(')
					{
						Pop(S);
					}
					else
					{
						fprintf(stderr, "The symbols not balance!\n");
						return;
					}
				}
				break;
			case ']':
				if (IsEmpty(S))
				{
					fprintf(stderr, "The symbols not balance!\n");
					return;
				}
				else
				{
					if (Top(S) == '[')
					{
						Pop(S);
					}
					else
					{
						fprintf(stderr, "The symbols not balance!\n");
						return;
					}
				}
				break;
			case '}':
				if (IsEmpty(S))
				{
					fprintf(stderr, "The symbols not balance!\n");
					return;
				}
				else
				{
					if (Top(S) == '{')
					{
						Pop(S);
					}
					else
					{
						fprintf(stderr, "The symbols not balance!\n");
						return;
					}
				}
				break;
			default:
				break;
		}
		ch++;
	}
	if (IsEmpty(S))
	{
		fprintf(stdout, "The Symbols Balance!\n");
	}
	else
	{
		fprintf(stderr, "The Symbols Not Balance!\n");
	}
}

int main(void)
{
	char ch[] = "(a+b){[dc*d}";
	Stack S = CreateStack();
	CheckSymbol(ch, S);
	DisposeStack(S);
	getchar();
	return 0;
}

 

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值