0
点赞
收藏
分享

微信扫一扫

【数据结构】基于栈的括号匹配算法(C语言)

题目: 设表达式中包含三种括号:圆括号、方括号和花括号,它们可互相嵌套,如 ([{}]) 或 ({[][()]}) 等均为正确的格式,而 {[]})} 、{[() ]或 ([]} 均为不正确的格式。
利用栈的结构编写程序检验输入的括号表达式是否匹配。

思路: 利用栈“后进先出”的特点,每次读入一个括号:
(1)左括号:直接入栈等待匹配;
(2)右括号:
①栈为空说明没有与该右括号匹配的左括号,则该右括号多余;
②栈不为空则将该右括号与栈顶括号比较,若匹配则将栈顶元素出栈,若不匹配则说明左右括号类型不匹配。

当所有括号全部全部读完时,若栈为空则说明所有括号都匹配,若栈不为空则说明有左括号多余。
注意:只有左括号需要进栈,右括号不需要进栈。

完整代码+注释

# include<stdio.h>
# define Stack_Size 50
# define FALSE 0
# define TRUE 1

/*顺序栈的存储结构*/
typedef struct {
	char elem[Stack_Size];
	int top;
}SeqStack;

/*初始化顺序栈*/
void InitStack(SeqStack* S) {
	S->top = -1;
}

/*顺序栈进栈*/
int Push(SeqStack* S, char x) {
	if (S->top == Stack_Size - 1)
		return FALSE;
	S->top++;						//修改栈顶指针
	S->elem[S->top] = x;			//x进栈
	return TRUE;
}

/*顺序栈出栈*/
int Pop(SeqStack* S) {
	if (S->top == -1)
		return FALSE;
	S->top--;						//修改栈顶指针
	return TRUE;
}

/*返回栈顶元素*/
char GetTop(SeqStack* S) {
	if (S->top == -1)
		return NULL;
	char x;
	x = S->elem[S->top];			//栈顶元素赋值给x
	return x;
}

/*返回栈内元素个数*/
int GetLen(SeqStack* S) {
	return S->top + 1;
}

/*顺序栈判空函数,为空返回TRUE*/
int IsEmpty(SeqStack* S) {
	if (S->top == -1)
		return TRUE;
	else
		return FALSE;
}

/*同类型括号判断*/
int Match(char a, char b) {
	if (a == '(') {
		if (b == ')')
			return TRUE;
		else
			return FALSE;
	}
	if (a == '[') {
		if (b == ']')
			return TRUE;
		else
			return FALSE;
	}
	if (a == '{') {
		if (b == '}')
			return TRUE;
		else
			return FALSE;
	}
}

/*基于栈的括号匹配算法*/
void BracketMatch(SeqStack* S, char* str) {
	int i, a, flag = 1;
	char ch;
	InitStack(&S);					//初始化为空栈
	for (i = 0; str[i] != '\0'; i++) {
		switch (str[i]) {
		case '(':
		case '[':
		case '{':
			Push(&S, str[i]);		//左括号则进栈
			break;
		case ')':
		case ']':
		case '}':
			if (IsEmpty(&S)) {		//栈为空说明当前右括号前无左括号
				printf("括号不匹配,右括号 %c 多余!\n", str[i]);
				flag = 0;
			}
			else {
				ch = GetTop(&S);
				if (Match(ch, str[i]))
					Pop(&S);		//左右括号匹配则将左括号出栈
				else {
					printf("括号不匹配,左括号 %c 右括号 %c 类型不匹配!\n", ch, str[i]);
					Pop(&S);		//将不匹配的左括号出栈
					flag = 0;
				}
			}
		}
	}
	if (IsEmpty(&S) && flag)		//括号字符串全部扫描完时栈为空且flag不为0,说明所有括号均匹配
		printf("括号匹配!\n");
	else {							//栈中仍有元素剩余说名左括号有多余
		int length = GetLen(&S);
		for (i = 0; i < length; i++) {		//输出多余的左括号
			printf("括号不匹配,左括号 %c 多余!\n", GetTop(&S));
			Pop(&S);
		}
	}
}

int main() {
	SeqStack S;
	int i, length;
	char str[Stack_Size];
	printf("请输入括号字符串长度:");
	scanf("%d", &length);
	printf("请输入括号字符串:");
	for (i = 0; i < length; i++)
		scanf(" %c", &str[i]);
	str[i] = '\0';

	BracketMatch(&S, str);			//调用括号匹配算法函数

	return 0;
}

运行结果
结果1
结果2
结果3
结果4

举报

相关推荐

0 条评论