当前位置: 首页 > 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://www.xdnf.cn/news/1467055.html

相关文章:

  • 【Linux系统】POSIX信号量
  • Jenkins环境搭建与使⽤
  • C语言(长期更新)第15讲 指针详解(五):习题实战
  • Kimi K2-0905重磅发布:月之暗面再次引领AI编程新纪元
  • 【Rust 入门】01. 创建项目
  • Rust 的生命周期与借用检查:安全性深度保障的基石
  • 极快文本嵌入推理:Rust构建高性能嵌入推理解决方案
  • Qoder 全面解析:三大模式与开发者实战指南
  • 【硬件笔记】负载是如何烧MOS的?
  • DAY1:错题日记
  • 【Kafka】Kafka使用场景用例Kafka用例图
  • 2025年COR SCI2区,基于近似细胞分解的能源高效无人机路径规划问题用于地质灾害监测,深度解析+性能实测
  • 实战案例:数字孪生+可视化大屏,如何高效管理智慧能源园区?
  • Swift 解题:LeetCode 372 超级次方(Super Pow)
  • C/C++ 与 Lua 互相调用详解
  • SpringMVC(一)
  • 混合架构大型语言模型(Jamba)
  • 当低代码遇上AI,有趣,实在有趣
  • WebRTC进阶--WebRTC错误Failed to unprotect SRTP packet, err=9
  • 【Flutter】drag_select_grid_view: ^0.6.2 使用
  • AI架构师的思维方式与架构设计原则
  • 【LeetCode - 每日1题】最少操作使num1归零
  • Bean作用域和生命周期
  • Golang中的context包介绍及源码阅读
  • 谙流 ASK 技术解析(一):秒级扩容
  • Android,jetpack Compose模仿QQ侧边栏
  • 华为云昇腾云服务
  • 数据安全成焦点:基于Hadoop+Spark的信用卡诈骗分析系统实战教程
  • 为什么外网主机可以telnet通内网nginx端口,但是http请求失败?
  • Mysql:由逗号分隔的id组成的varchar联表替换成对应文字