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

相关推荐
地平线开发者3 小时前
【模型轻量化专题】衡量模型轻量性的指标
算法
学习星球7 小时前
OFDM技术精讲:正交性推导、循环前缀原理与80行Python链路仿真(附实测数据)
算法·面试·前端框架
alphaTao13 小时前
LeetCode 每日一题 2026/8/24-2026/8/30
python·算法·leetcode
Interview Aid11213 小时前
TikTok OA 四题分享|半小时内 AC,题目基本都是实现题
java·开发语言·算法·面试·职场和发展
顶点多余1 天前
那些在算法中适合巩固的知识点---1
java·前端·算法
AI情绪识别开源1 天前
检信 ALLEMOTION OS 加密打包可执行程序 — 全面测试报告版本: v1.3功能测试 / 性能测试 /
开发语言·数据结构·人工智能·功能测试
罗西的思考1 天前
【Agentic RL / 强化学习框架】Molt 设计解读
人工智能·算法·机器学习
hahaha60161 天前
HLS高层次综合设计技巧--C++类和模板
图像处理·人工智能·算法·计算机视觉
多弗朗皮卡丘1 天前
算法详解4:买卖股票的最佳时机系列(上)
算法
Brilliantwxx1 天前
【C语言】 初入嵌入式C语言复习(基础+进阶面试题)
c语言·开发语言