【数据结构】栈的应用--括号匹配的检验

本文介绍如何使用链栈数据结构来检测嵌套括号的匹配问题,通过理解'期待的急迫程度'并结合C语言代码实现,确保括号如 '()'、'{}

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        假设表达式中允许包括三种括号 “(” “{” “[”。嵌套顺序随意,“({}[])”或“{]({{}}))”都可以。但是第一种正确,第二种不正确。检验括号是否匹配可用“期待的急迫程度”这个概念来描述。如果当前括号为“(”下一个括号为“)”,则匹配,即可弹栈。而当前括号为“(”,而下一个括号为“}”。则将“}”压栈。当读取完所有括号后。检验栈是否为空即可。如果栈为空,则括号都已匹配,如果不空,则表示括号不匹配。

        这里我用的是链栈。由于不知道用户输入括号的长度,所以先让用户输入括号的个数,这样再申明一个数组。让用户将所有括号输入进去即可。

//括号匹配,使用链栈完成

#include<stdio.h>
#include <malloc.h>
#define ElemType char
#define array_length 50
typedef struct Node {
	ElemType data;
	Node* next;
}*LinkStack, Node;//链栈


LinkStack InitLinkStack() {
	LinkStack Ls;
	Ls = (LinkStack)malloc(sizeof(Node));
	Ls->next = NULL;
	return Ls;//返回头结点
}

void createLinkStack(LinkStack L, int num) {
	ElemType Edata;
	LinkStack assoL = L;//栈底的副本
	Node* newL;
	printf("请分别输入元素\n");
	while (num > 0) {
		scanf_s(" %c", &Edata);
		newL = (Node*)malloc(sizeof(Node));
		newL->next = NULL;
		newL->data = Edata;
		assoL->next = newL;//将新元素给栈顶
		num--;
		assoL = newL;
	}
	//assoL = L;
}

void printStack(LinkStack L) {
	LinkStack assoL = L;//栈底的副本
	if (assoL->next == NULL) {
		printf("空栈\n");
	}
	while (assoL->next != NULL) {
		assoL = assoL->next;
		printf("%c ", assoL->data);

	}
	//assoL = L;
}

void push(LinkStack L, ElemType Edata) {
	LinkStack assoL = L;//栈底的副本
	while (assoL->next != NULL) {
		assoL = assoL->next;
	}//找到栈顶
	Node* newL = (Node*)malloc(sizeof(Node));
	newL->next = NULL;
	newL->data = Edata;
	assoL->next = newL;
	//assoL = L;
}

void pop(LinkStack L) {
	LinkStack assoL = L;//栈底的副本
	if (assoL->next == NULL) {
		printf("栈已空");
		return;
	}
	while (assoL->next != NULL) {
		if (assoL->next->next != NULL) {
			assoL = assoL->next;
		}
		else {
			assoL->next = NULL;
			break;
		}
	}
}
//获取栈顶元素
ElemType getTop(LinkStack L) {
	Node* assoL = L;
	if (assoL->next == NULL) {
		return assoL->data;
	}
	while (assoL->next != NULL) {
		assoL = assoL->next;
	}
	return assoL->data;
}

bool isEmpty(LinkStack L) {
	Node* assoL = L;
	if (assoL->next == NULL) return true;
	return false;
}

void doFunction(LinkStack L, char* arrays){
	int i = 0;
	while (arrays[i] != '\0') {
		switch (arrays[i]) {
		case '{':
		case '[':
		case '(':
			push(L, arrays[i]);
			break;
		case ')':
		case '}':
		case ']':
			if (getTop(L) == '(' && arrays[i] == ')' ||
				getTop(L) == '[' && arrays[i] == ']' ||
				getTop(L) == '{' && arrays[i] == '}') {
				pop(L);
			}
			else {
				push(L, arrays[i]);
			}
			break;
		}
		i++;
	}
	
}
int main() {
	LinkStack L = NULL;
	int num = 0;
	int in = 0;
	int i = 0;
	ElemType data = 0;
	char Edata;
	L = InitLinkStack();
	printf("请输入括号的个数:\n");
	scanf_s("%d", &num);
	char arrays[array_length];
	printf("请输入括号");
	//录入字符串
	for (i = 0; i < num; i++) {
		scanf_s(" %c", &Edata);
		arrays[i] = Edata;
	}
	arrays[i] = '\0';
	doFunction(L, arrays);
	if (isEmpty(L))
		printf("括号匹配\n");
	else
		printf("括号不匹配\n");
	}

 

 

 

Vivado2023是一款集成开发环境软件,用于设计和验证FPGA(现场可编程门阵列)和可编程逻辑器件。对于使用Vivado2023的用户来说,license是必不可少的。 Vivado2023的license是一种许可证,用于授权用户合法使用该软件。许可证分为多种类型,包括评估许可证、开发许可证和节点许可证等。每种许可证都有不同的使用条件和功能。 评估许可证是免费提供的,让用户可以在一段时间内试用Vivado2023的全部功能。用户可以使用这个许可证来了解软件的性能和特点,对于初学者和小规模项目来说是一个很好的选择。但是,使用评估许可证的用户在使用期限过后需要购买正式的许可证才能继续使用软件。 开发许可证是付费的,可以永久使用Vivado2023的全部功能。这种许可证适用于需要长期使用Vivado2023进行开发的用户,通常是专业的FPGA设计师或工程师。购买开发许可证可以享受Vivado2023的技术支持和更新服务,确保软件始终保持最新的版本和功能。 节点许可证是用于多设备或分布式设计的许可证,可以在多个计算机上安装Vivado2023,并共享使用。节点许可证适用于大规模项目或需要多个处理节点进行设计的用户,可以提高工作效率和资源利用率。 总之,Vivado2023 license是用户在使用Vivado2023时必须考虑的问题。用户可以根据自己的需求选择合适的许可证类型,以便获取最佳的软件使用体验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值