找回密码
 立即注册
首页 业界区 科技 判断字符串是否合理

判断字符串是否合理

辗振 4 天前
通过键盘输入一个包括  '(' 和 ')' 的字符串string ,判断字符串是否有效。要求设计算法实现检查字符串是否有效,有效的字符串需满足以下条件:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
每个右括号都有一个对应的相同类型的左括号。
  1. /***************************************************************************
  2. *function:创建一个顺序栈,判断字符串是否合理
  3. *author:jindouliu2024@163.com
  4. *date:2025.4.4
  5. *
  6. * Copyright (c)  2024-2025   jindouliu2024@163.com   All right Reserved
  7. * ***************************************************************************/
  8. #include<stdio.h>
  9. #include <stdbool.h>
  10. #include <stdlib.h>
  11. //指的是顺序表中的元素的数据类型,可以根据需要进行修改
  12. typedef int  DataType_t;
  13. //构造记录顺序栈SequenceStack各项参数(顺序栈的栈底地址 + 顺序栈的容量 + 顺序栈中最后有效元素的下标)的结构体
  14. typedef struct SequenceStack
  15. {
  16.         DataType_t * Bottom;                //记录顺序栈的栈底
  17.         unsigned int Size;                //记录顺序栈的容量
  18.         int                         Last;      //顺序栈中最后元素的下标       
  19. }SeqStack_t;
  20. //创建顺序栈并对顺序栈进行初始化
  21. SeqStack_t * SeqStack_Create(unsigned int size)
  22. {
  23.         //1.利用calloc为顺序栈的管理结构体申请一块堆内存
  24.         SeqStack_t *Manager = (SeqStack_t *)calloc(1,sizeof(SeqStack_t));
  25.         if(NULL == Manager)
  26.         {
  27.                 perror("calloc memory for manager is failed");
  28.                 exit(-1); //程序异常终止
  29.         }
  30.         //2.利用calloc为所有元素申请堆内存
  31.         Manager->Bottom = (DataType_t *)calloc(size,sizeof(DataType_t));
  32.         if (NULL == Manager->Bottom)
  33.         {
  34.                 perror("calloc memory for element is failed");
  35.                 free(Manager);
  36.                 exit(-1); //程序异常终止
  37.         }
  38.         //3.对管理顺序栈的结构体进行初始化(元素容量 + 最后元素下标)
  39.         Manager->Size = size;        //对顺序栈中的容量进行初始化
  40.         Manager->Last = -1;                //由于顺序栈为空,则最后元素下标初值为-1
  41.        
  42.         return Manager;
  43. }
  44. //向顺序栈加入元素
  45. bool SeqStack_Add(SeqStack_t *Manager, DataType_t Data)
  46. {
  47.         //1.判断顺序表是否已满
  48.         if ( SeqStack_IsFull(Manager) )
  49.         {
  50.                 printf("SeqStack is Full!\n");
  51.                 return false;
  52.         }
  53.         //2.如果顺序栈有空闲空间,则把新元素添加到顺序栈
  54.         Manager->Bottom[++Manager->Last] = Data;
  55.         return true;
  56. }
  57. //判断顺序栈是否为空
  58. bool SeqStack_IsEmpty(SeqStack_t *Manager)
  59. {
  60.         return (-1 == Manager->Last) ? true : false;
  61. }
  62. DataType_t SeqStack_Del(SeqStack_t *Manager)
  63. {
  64.        
  65.         // 不为空时
  66.         if(Manager->Last >=0){
  67.         return Manager->Bottom[Manager->Last--];
  68.         }
  69. }
  70. bool Is_valid_Str(SeqStack_t *Manager,char *str)
  71. {
  72.         while(*str != '\0'){
  73.                 if(*str == '('){
  74.                         SeqStack_Add(Manager,1);
  75.                 }
  76.                 else if(*str == ')') {
  77.                         //判断栈是否为空
  78.                         if(SeqStack_IsEmpty(Manager) == true){
  79.                                 return false;
  80.                         }
  81.                         SeqStack_Del(Manager);
  82.                 }
  83.                 str++;
  84.         }
  85.         //判断栈是否为空
  86.         if(!SeqStack_IsEmpty(Manager)){
  87.                 return false;
  88.         }
  89.         return true;
  90. }
  91. int main()
  92. {
  93.         //创建一个空的顺序栈
  94.         SeqStack_t *qlist=SeqStack_Create(100);
  95.         char str[100];
  96.         //输入一个字符串
  97.         printf("请输入一个字符串:");
  98.         scanf("%s",str);
  99.         //调用函数进行判断
  100.         if(Is_valid_Str(qlist,str) == false){
  101.                 printf("this is not valid\n");
  102.         }
  103.         else{
  104.                 printf("this is valid\n");
  105.         }
  106.         return 0;
  107. }
复制代码
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册