括号匹配(使用链栈实现)

0. 前言

数据结构——括号匹配(使用链栈实现)

操作系统:Windows10 家庭版

开发环境:Dev-Cpp

1. 括号匹配——题目描述

给定一个只包含括号的字符串s,判断这个字符串中的括号是否匹配。如果匹配,返回true;否则返回false。

例如,对于字符串s = “(()())”,括号是匹配的。对于字符串s = “()())”,则括号是不匹配的。

题目意思很简单,就是看看括号是否成对出现。

现在我们来给自己加大难度,不仅算小括号,把大括号中括号小括号全部算上。

2. 解题思路

可以用栈来解决。具体思路如下:

  • 创建一个栈stack,遍历字符串s中的每个字符char。
  • 如果char是左括号,将其压入栈stack中。
  • 如果char是右括号,弹出栈顶的字符,并判断是否匹配。
  • 如果与栈顶字符匹配,则继续遍历下一个字符。
  • 如果不匹配,则括号不匹配,返回false。
  • 如果遍历完整个字符串s后栈stack为空,则括号匹配,返回true;否则括号不匹配,返回false。

接下来看我的代码实现:

#include<iostream>
#include<malloc.h>
#include<string.h>
 
using namespace std;
 
typedef int ElemType;
 
typedef struct LinkNode {
	ElemType data;
	struct LinkNode* next;
}*LiStack,LinkNode;
 
 
bool InitStack(LiStack& S);
bool StackEmpty(LiStack S);
bool Push(LiStack& S, ElemType x);
bool Pop(LiStack& S, ElemType& x);
bool GetTop(LiStack S, ElemType& x);
bool DestoryStack(LiStack& S);
 
bool InitStack(LiStack& S) {
	S = (LiStack)malloc(sizeof(LinkNode));
	if (S == NULL) return false;
	S->next = NULL;
	return true;
}
 
bool StackEmpty(LiStack S) {
	if (S->next == NULL) return true;
	return false;
}
 
bool Push(LiStack& S, ElemType x) {
	LinkNode* p;
	p = (LinkNode*)malloc(sizeof(LinkNode));
	if (p == NULL) return false;
	p->data = x;
	p->next = S->next;
	S->next = p;
	return true;
}
 
bool Pop(LiStack& S, ElemType& x) {
	if (StackEmpty(S)) return false;
	LinkNode* p = S->next;
	S->next = p->next;
	x = p->data;
	free(p);
	return true;
}
 
bool GetTop(LiStack S, ElemType& x) {
	if (StackEmpty(S)) return false;
	x = S->next->data;
	return true;
}
 
bool DestoryStack(LiStack& S) {
	while (S->next != NULL) {
		LinkNode* p = S->next;
		S->next = p->next;
		free(p);
	}
	free(S);
	return true;
}
 
void test() {
 
	LiStack S;
	InitStack(S);
	for (int i = 0; i <= 5; i++) {
		Push(S, i);
	}
	ElemType x;
	GetTop(S, x);
	cout << x << endl;
	while (!StackEmpty(S)) {
		Pop(S, x);
		cout << x << endl;
	}
}
 
int main() {
	
	//初始化堆栈	
	LiStack s;
	printf("堆栈指针初始化前的地址是:%p\n",s);
	InitStack(s);
	printf("堆栈指针初始化后的地址是:%p\n",s);
	
	char left[] = "{[(";
	char right[] = "}])"; 
	int flah;
	
	
	//输入 
	char str[20];
	printf("请输入一个含括号的字符串:");
	scanf("%s",str);

	
	int i,j,k;
	for(i=0;i<strlen(str);i++)
	{
		for(j=0;j<3;j++)
		{
			//检查到为左括号则入栈 
			if(str[i] == left[j])
			{
				Push(s,str[i]);
			}
			
			//检查到为右括号则进行检查 
			else if(str[i] == right[j])
			{
				//栈空还是匹配到右括号说明不匹配,直接退出 
				if (StackEmpty(s))
				{
					printf("右括号数大于左括号!\n");
					exit(0);
				}
				ElemType temp_s;
				Pop(s,temp_s);
				
				//查找右括号对应左括号的位号 
				for (k=0;k<3;k++)
				{
					if (temp_s == left[k])
					break;
				} 
				
				//匹配则输出,不匹配则退出 
				if (right[k] == str[i])
				printf("%c%c\n",temp_s,str[i]);
				else{
					printf("error!\n");
					exit(0);
				}
			}
			//其他字符则继续执行循环 
			else continue;
		}
	}
	
	//能够在上面三重循环中不 exit(0) 说明括号都匹配上了
	
	
	if (StackEmpty(s))
		printf("匹配成功\n");
	else 
		printf("匹配失败\n");
		
	//执行完毕释放堆栈内存 
	free(s); 

	return 0;
}

在这里插入图片描述
匹配成功!

3. 括号匹配意义

括号匹配是一种常用的算法技巧,主要用于验证括号是否成对出现、嵌套是否合法等等。

在编程中,括号匹配常用于编写高级语言的编译器、解析器等程序。在这些程序中,括号匹配常用于检查代码中括号的嵌套是否正确,因为括号的嵌套错误常常会导致程序编译或解析出错。

此外,在日常生活中,括号匹配也有很多实际应用。比如,医生为患者开具处方时,需要将药品名和用量用括号括起来,如果括号匹配错误,会导致药方不清晰,给患者带来风险。再比如,在数学公式中,括号的正确使用也是非常重要的,因为括号的错误使用可能会导致公式结果出错。

因此,括号匹配可以帮助我们在编程和生活中减少错误,提高工作效率和生活质量。

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IoT_H2

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值