如果不了解栈可以先阅读 栈的知识这篇文章。
一. 问题描述
可以自己先动手试试这道题,效果会更好
题目链接:力扣:有效的括号
二.问题分析
这个题可成“括号的消除”,字符串中离得最近并且同类型的一对括号优先进行消除,直至不能再消除,如果字符串最后变成空字符串,说明是有效字符串,否则是无效字符串。
为什么这个题会用到栈这个结构体呢?栈的特点是先进后出,所以这个题必定和先进后出有关系。
三.解题思路
思路:从左至右扫描字符串,如果当前字符为左括号 则入栈,如果该字符为右括号,栈的栈顶元素出栈,该字符与栈顶元素进行比较,若为同类型括号则可以”消除“,继续扫描。如果不为同类型,直接返回false,表示为无效字符串。
一.匹配成功
二.匹配不成功
1.第一种情况
2.第二种情况:
3.第三种情况
三. 流程图
四.代码分析
#include<stdio.h>
#include<string.h>
#include<stdbool.h>//包含bool函数的头文件
char pipei(char a)
{
if (a == '(')
return ')';
else if (a == '{')
return '}';
else if (a == '[')
return ']';
return 0;
}
//这个函数用来查找左括号对应的右括号
bool test(char str[])
{
int n = strlen(str);
char stk[n];
int top = 0;
if(n%2!=0)
return false;
//有效的字符串中的括号是成对出现,所以长度为偶数
for (int i = 0; i < n; i++)
{
char c = str[i];
if (pipei(c))
//如果不返回0,说明字符为左括号
stk[top++]=c;
//把左括号入栈
else if (top == 0 || pipei(stk[--top])!=c)
return false;
//如果该符号是右括号并且栈为空,返回false。
//或者该符号是右括号并且栈顶符号(左括号)和该符号不匹配,返回false。
}
return top==0;
//扫描完整个字符串后如果栈顶top为0,说明栈为空,为有效字符串。
}
int main()
{
char str[10];
scanf("%s",str);
if(test(str))
printf("true");
else
printf("false");
}
五.运行结果
希望我的分享能让您有所启发,也希望你能献上自己宝贵的建议!