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

相关推荐
日落辞朝阳9 小时前
数据结构——顺序表
数据结构
阳光明媚sunny9 小时前
爬楼梯算法java实现
算法·动态规划
Z_z在努力9 小时前
【数据结构】哈希表(Hash Table)详解
数据结构·哈希算法·散列表
贝塔实验室9 小时前
LDPC码的概念
科技·学习·程序人生·算法·学习方法·程序员创富·改行学it
weixin_3077791310 小时前
矩形势阱(V(x) = -H for |x|≤L)的束缚态能级求解与宇称分类
算法
MMjeaty10 小时前
数据结构——栈和队列
数据结构·算法
瓜瓜怪兽亚10 小时前
前端基础知识---10 Node.js(三)
数据结构·数据库·node.js
机器学习之心15 小时前
多目标鲸鱼优化算法(NSWOA),含46种测试函数和9个评价指标,MATLAB实现
算法·matlab·多目标鲸鱼优化算法·46种测试函数·9个评价指标
古译汉书16 小时前
嵌入式铁头山羊STM32-各章节详细笔记-查阅传送门
数据结构·笔记·stm32·单片机·嵌入式硬件·个人开发
max50060016 小时前
基于Meta Llama的二语习得学习者行为预测计算模型
人工智能·算法·机器学习·分类·数据挖掘·llama