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

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

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

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

#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");
	}

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值