当前位置: 首页 > news >正文

假设一个算术表达式中包含圆括号、方括号和花括号3种类型的括号,编写一个算法来判别,表达式中的括号是否配对,以字符“\0“作为算术表达式的结束符

思想:这道题是栈的应用类型,我们可以建立一个栈来保存'(','[','{',通过遍历字符串如果是三个左括号其中一个则入栈,当遇到')'']''}'则出栈配对,如果左右匹配,则遍历下一个元素,如果不匹配直接返回,如果遍历字符串结束,但栈中还有元素,则是左符号单身,如果已经空栈,但是又遍历到一个右括号,则是右括号单身

具体代码:

#include<stdio.h>
#include<stdbool.h>
#include<stdlib.h>
typedef struct LinkStack
{
char data;
struct LinkStack* next;
}LinkStack;
void InitStack(LinkStack** S)//初始化栈(不带头结点链表实现)
{
(*S) = NULL;
return;
}
bool Push(LinkStack** S,char ch)//入栈
{
if (ch == '(' || ch == '[' || ch == '{')
{
LinkStack* p = (LinkStack*)malloc(sizeof(LinkStack));
if (p == NULL)
return false;
//第一次入栈
if ((*S) == NULL)
{
p->data = ch;
p->next = NULL;
(*S) = p;
}
//后续入栈
else
{
p->data = ch;
p->next = (*S);
(*S) = p;
}
}
return true;

}
bool Pop(LinkStack** S)//出栈并且带回元素
{
if ((*S) == NULL)//空栈无法出栈
return false;
LinkStack* p = (*S);
//*x = p->data;
(*S) = p->next;
free(p);
return true;
}
LinkStack* GetTop(LinkStack* S)//返回栈顶指针
{
if (S == NULL)//空栈
return NULL;
LinkStack* p = S;
return p;
}
bool EmptyStack(LinkStack* S)//判断空栈
{
if (S == NULL)
return true;
return false;
}
void JudgeStack(LinkStack **S,char arr[])//判断
{
char* a = arr;
while (*a != '\0')
{
if (*a == '(' || *a == '[' || *a == '{')//如果当时是三个括号其中一个则入栈
Push(S, *a);
else if (EmptyStack(*S) == false && *a == ')' && GetTop((*S))->data == '(')//如果是'('则出栈
Pop(S);
else if (EmptyStack(*S) == false && *a == ')' && GetTop((*S))->data != '(')//如果不是则直接退出
{
printf("配对失败\n");
printf("%c %c\n",*a, GetTop((*S))->data);
return;
}
else if (EmptyStack(*S) == false && *a == ']' && GetTop((*S))->data == '[')//如果是'['则出栈
Pop(S);
else if (EmptyStack(*S) == false && *a == ']' && GetTop((*S))->data != '[')
{
printf("配对失败\n");
printf("%c %c\n", *a, GetTop((*S))->data);
return;
}
else if (EmptyStack(*S) == false && *a == '}' && GetTop((*S))->data == '{')//如果是'{'则出栈
Pop(S);
else if (EmptyStack(*S) == false && *a == '}' && GetTop((*S))->data != '{')
{
printf("配对失败\n");
printf("%c %c\n", *a, GetTop((*S))->data);
return;
}
else if (EmptyStack(*S) == true && (*a == ')' || *a == ']' || *a == '}'))//如果栈为空,且字符串中还有元素
printf("右括号单身\n");
a++;//向后遍历字符串

    }
if (EmptyStack(*S) == false)//如果字符串已遍历结束但栈里还有元素
printf("左括号单身\n");
else
printf("配对成功\n");
return;
}
int main()
{
char arr[] = "[(3 + 2) * 5 + 3](]()";
LinkStack* S;//指向栈的指针
InitStack(&S);//初始化栈
JudgeStack(&S , arr);
return 0;
}

注:此代码中运用了大量的if-else语句,不是很美观(其实懒得改了),大家如果要引用可以自行优化代码


文章转载自:

http://DChTWlCj.bnyLg.cn
http://rgKyjv8M.bnyLg.cn
http://eMlDekPp.bnyLg.cn
http://q8aq3ilR.bnyLg.cn
http://Rb7ScTuG.bnyLg.cn
http://12LY34I6.bnyLg.cn
http://yJKMUArX.bnyLg.cn
http://wOVp9wnW.bnyLg.cn
http://XOv5WVh0.bnyLg.cn
http://IcXOrbNB.bnyLg.cn
http://qKA1QQKa.bnyLg.cn
http://MG92NZg5.bnyLg.cn
http://vi2Vt7T2.bnyLg.cn
http://7UHNjKZR.bnyLg.cn
http://A1ZDMfzO.bnyLg.cn
http://U8lIHRDk.bnyLg.cn
http://9FLHmVPb.bnyLg.cn
http://H2M2AzUs.bnyLg.cn
http://G4RvJ0W8.bnyLg.cn
http://LYhOkIpJ.bnyLg.cn
http://vYUq1oJQ.bnyLg.cn
http://z5ZZm2b8.bnyLg.cn
http://gSddRTIh.bnyLg.cn
http://nI6eONs2.bnyLg.cn
http://oEU4lV2g.bnyLg.cn
http://LUCXmEzS.bnyLg.cn
http://hws4dBER.bnyLg.cn
http://W9hSbVTk.bnyLg.cn
http://8XxWVF7J.bnyLg.cn
http://3oj31kVL.bnyLg.cn
http://www.dtcms.com/a/368566.html

相关文章:

  • 【数学建模】数据预处理入门:从理论到动手操作
  • 机器学习(七)决策树-分类
  • 汽车软件研发智能化:AI在CI/CD中的实践
  • 有序数组,距离目标最近的k个数 二分查找
  • 函数式组件父子ref通讯
  • AAB包转apks转apk
  • 快速、归并、堆、希尔、ArrayList排序
  • 【73页PPT】美的简单高效的管理逻辑(附下载方式)
  • OctShop点单系统+收银系统+商城系统+IM在线客服系统一体化源码
  • 大彩串口屏-烧录与调试
  • Linux之Docker虚拟化技术(四)
  • JS中的String的常用方法
  • Linux调试命令速查:Java/微服务必备
  • 一文吃透 Protobuf Proto3 语法 + 风格规范 + 枚举行为全解(含检查清单与示例)
  • 第24节:3D音频与空间音效实现
  • AI Compass前沿速览:Kimi K2、InfinityHuman-AI数字人、3D-AI桌面伴侣、叠叠社–AI虚拟陪伴
  • 8051单片机-蜂鸣器
  • 来WAVE SUMMIT,文心快码升级亮点抢先看!
  • Redis 深度解析:数据结构、持久化与集群
  • MyBatis高频问题-自动映射与缓存解析
  • 力扣152:乘积最大子数组
  • honmony 中集成 tuanjie/unity
  • (二)文件管理-基础命令-rm命令的使用
  • 鸿蒙系统开发资料汇总:全面助力鸿蒙开发HarmonyOS
  • 手写React状态hook
  • scrypt 密钥派生算法(RFC7914)技术解析及源码示例
  • 案例分享|企微智能会话风控系统:为尚丰盈铝业筑牢沟通安全防线
  • Docker部署Drawnix开源白板工具
  • linux缺页中断频繁怎么定位
  • 代码随想录70期day3