目录
- 0. 前言
- 1. 括号匹配——题目描述
- 2. 解题思路
- 3. 括号匹配意义
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. 括号匹配意义
括号匹配是一种常用的算法技巧,主要用于验证括号是否成对出现、嵌套是否合法等等。
在编程中,括号匹配常用于编写高级语言的编译器、解析器等程序。在这些程序中,括号匹配常用于检查代码中括号的嵌套是否正确,因为括号的嵌套错误常常会导致程序编译或解析出错。
此外,在日常生活中,括号匹配也有很多实际应用。比如,医生为患者开具处方时,需要将药品名和用量用括号括起来,如果括号匹配错误,会导致药方不清晰,给患者带来风险。再比如,在数学公式中,括号的正确使用也是非常重要的,因为括号的错误使用可能会导致公式结果出错。
因此,括号匹配可以帮助我们在编程和生活中减少错误,提高工作效率和生活质量。