假设一个算术表达式中包含圆括号、方括号和花括号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语句,不是很美观(其实懒得改了),大家如果要引用可以自行优化代码

相关推荐
致Great1 小时前
科研人的 AI,不该只回答问题:我用字节TraeWork 跑了一遍真实研究任务
算法
纵有疾風起1 小时前
线性表的定义与基本操作 — 从逻辑结构到 ADT 接口
数据结构·算法·408·线性表·adt
wuyk5551 小时前
1.栈:后进先出的线性数据结构
c语言·数据结构·stm32·单片机
测试_AI_一辰2 小时前
AI Agent 评测最隐蔽的坑-记忆
人工智能·算法·ai·自动化·ai编程
lucas_AI2 小时前
给YOLO检测器插 LoRA,'插对地方'比'插什么'更要命
人工智能·算法
LuminousCPP2 小时前
数据结构-时间与复杂度|时间/空间复杂度 + 两道力扣练习 + 二分查找复盘
c语言·数据结构·经验分享·算法·leetcode
Nil2082 小时前
leetcode 三数之和
数据结构·算法·leetcode
带鱼吃猫3 小时前
预处理器:宏、运算符与条件编译
c语言·开发语言
小小龙学IT3 小时前
C++ std::vector 底层实现深度解析:内存布局、扩容策略、移动语义与迭代器失效
开发语言·c++·算法
eBest数字化转型方案3 小时前
从工程视角拆解冰柜资产管理:拍照识别 pipeline、纯净度算法与 IoT 选型踩坑
人工智能·物联网·算法