2024王道408数据结构 P92 T1
括号匹配问题
- 首先我们还是先看题目的意思,让我们判断表达式中的()[]{}三种括号是否合法,这题属于栈的应用,比较经典。既然是表达式那免不了其中就有其他内容,比如数字啊别的字符啊等等,所以我们要对字符串进行判断,只有当是括号时我们才把它入栈。
- 我们先建立一个空栈s,假设字符串叫str,
if (str[i] == '(' || str[i] == '[' || str[i] == '{')
我们用i去遍历字符串str,只有当该字符是左括号时我们才把它入栈EnStack(s, str[i])
,至于入栈的函数我们就不用多说了吧我们已经写过很多遍了。 - 入栈之后我们就要判断左括号是否有与其匹配的右括号,当我们遍历到一个右括号时,如果它是’)',那我们就把栈顶元素给出栈,出栈的元素放进ans里,判断这个ans是否时左括号’(',如果不是的话直接返回false,表示其表达式就是不合法的。
- 这样凭空说可能有点抽象,我们举个例子,假设字符串str中放的内容是
{[()]}
,当我们遍历到左括号时把它入栈,
ok当我们接下来遍历到右括号时,也就是例子中的),我们就把栈顶元素给出栈,判断它是否与)相匹配,
如果不匹配的话我们就返回false。接下来的其他括号也一样。 - 当我们把字符串遍历完后判断栈是否为空,如果为空的话就说明字符串中的括号都一一匹配了,他就是合法的表达式。
- 至于上文提到的入栈出栈操作和判断栈空栈满操作都比较基础了要自己会写
完整代码附上
//
// Created by 黎圣 on 2023/8/1.
//
#include "iostream"
//MAX是我举的例子额
#define MAX 10
struct Stack
{
char data[MAX];
int top;
};
//基础操作
//判断栈空
bool StackEmpty(Stack s)
{
if (s.top == -1) return true;
return false;
}
//判断栈满
bool StackOverflow(Stack s)
{
if (s.top == MAX - 1) return true;
return false;
}
//入栈
bool EnStack(Stack &s, char x)
{
if (StackOverflow(s) == true)
{
printf("栈满,入栈失败\n");
return false;
}
s.data[++s.top] = x;
return true;
}
//出栈
int DeStack(Stack &s, char &x)
{
if (StackEmpty(s) == true)
{
printf("栈空,出栈失败\n");
return false;
}
x = s.data[s.top--];
return 1;
}
//判断是否匹配
bool isRight(char *str)
{
Stack s;
s.top = -1;
int i = 0;
char ans;//用一个临时变量来存放出栈的元素
while (str[i] != '\0')
{
if (str[i] == '(' || str[i] == '[' || str[i] == '{')
EnStack(s, str[i]);
else if (str[i] == ')')
{
DeStack(s, ans);//出栈把栈顶元素带出来判断
if (ans != '(') return false;
}
else if (str[i] == ']')
{
DeStack(s, ans);
if (ans != '[') return false;
}
else if (str[i] == '}')
{
DeStack(s, ans);
if (ans != '{') return false;
}
i++;
}
if (StackEmpty(s) == true) return true;
else return false;
}
int main()
{
char *str = (char*)"(){}[]";
printf("%s\n", str);
if (isRight(str) == true)
printf("匹配");
else
printf("不匹配");
return 0;
}
感谢b站up主@吸血小金鱼感谢