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

相关推荐
春日见1 分钟前
自动驾驶数据驱动规控进化之路
运维·服务器·人工智能·深度学习·算法·机器学习·自动驾驶
bucenggaibian2 分钟前
搭建CMD编译C语言环境
linux·c语言·windows
普贤莲花9 分钟前
【【2026年第22周---写于20260531】---好好工作,好好生活】
程序人生·算法·leetcode·生活
Bingorl10 分钟前
机器学习之聚类算法
算法·机器学习·聚类
CS创新实验室10 分钟前
数据结构:程序世界的“收纳术“
数据结构
小欣加油14 分钟前
leetcode2126 摧毁小行星
数据结构·c++·算法·leetcode·职场和发展
菜菜的顾清寒14 分钟前
力扣HOT100(45) 二叉树的直径
算法·leetcode·职场和发展
東隅已逝,桑榆非晚21 分钟前
新手入门指南:认识 C 语言文件操作(下)
c语言·笔记
少司府21 分钟前
C++进阶:多态
c语言·开发语言·c++·多态·抽象类·虚函数·虚表指针
并不喜欢吃鱼21 分钟前
从零开始 C++----- 十三【C++ 数据结构】哈希表从原理到手撕实现(开放定址 + 链地址全覆盖)
数据结构·c++·散列表