鱼C论坛

 找回密码
 立即注册
查看: 126|回复: 1

[已解决]怎么修改

[复制链接]
发表于 2024-3-30 17:52:30 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #define MaxSize 50

  4. typedef struct             //存放数字
  5. {
  6.         char data[MaxSize];
  7.         int top;
  8. }opnds;

  9. typedef struct             //存放运算符
  10. {
  11.         char data[MaxSize];
  12.         int top;
  13. }optrs;

  14. void Init_Stack(optrs *&S)  //初始化栈
  15. {
  16.         S = (optrs *)malloc(sizeof(optrs));
  17.         S->top = 0;
  18. }

  19. bool Push(optrs *&S,char e)  //入栈
  20. {
  21.         if(S->top == MaxSize)
  22.                 return false;
  23.         S->data[S->top] = e;
  24.         S->top ++;
  25.         return true;
  26. }

  27. bool Pop(optrs *&S)  //出栈
  28. {
  29.         char e;
  30.         if(S->top == 0)
  31.                 return false;
  32.         S->top --;
  33.         e = S->data[S->top];
  34.         return true;
  35. }

  36. bool GetTop(optrs *&S,char &e)  //取栈顶元素
  37. {
  38.         if(S->top == 0)
  39.                 return false;
  40.         e = S->data[S->top - 1];
  41.         return true;
  42. }

  43. bool Match(char *p)      //判断括号是否匹配
  44. {
  45.         int i,j = 0,d;
  46.         optrs *S;
  47.         if(p[i] == '\0')
  48.         {
  49.                 return true;
  50.         }
  51.         Init_Stack(S);
  52.         for(i = 0;p[i] != '\0';i ++)  //遍历字符串
  53.         {
  54.                 j = i;
  55.                 while(p[j] >= '0' && p[j] <= '9')
  56.                 {
  57.                         d = d*10 + p[j] - '0';
  58.                         j ++;
  59.                        
  60.                 }
  61.                 if(d != 0)
  62.                 {
  63.                         opnds.data[opnds.top] = d;
  64.                         opnds.top ++;
  65.                 }
  66.                 i = j;
  67.                 if(('(' == p[i]||')' == p[i])||('[' == p[i]||']' == p[i])||('{' == p[i]||'}' == p[i]))
  68.                 {
  69.                         if('(' == p[i]||'[' == p[i]||'{' == p[i])
  70.                         {
  71.                                 Push(S,p[i]);
  72.                         }
  73.                         else
  74.                         {
  75.                                 char top;
  76.                                 GetTop(S,top);
  77.                                 if('(' == top && ')' == p[i]||'[' == top && ']' == p[i]||'{' == top && '}' == p[i])
  78.                                 {
  79.                                         Pop(S);
  80.                                 }
  81.                         }
  82.                 }
  83.         if(S->top != 0)
  84.                 return false;
  85.         else
  86.                 return true;
  87.         }
  88. }

  89. int main()
  90. {
  91.         char p[20];
  92.         int i;
  93.         printf("请输入算术运算表达式:\n");
  94.         for(i=0;i++;i<20)
  95.         {
  96.                 scanf("%c",p[i]);
  97.         }
  98.         if(Match(p))
  99.                 printf("匹配成功!\n");
  100.         else
  101.                 printf("匹配失败!\n");
  102. }
复制代码
最佳答案
2024-3-30 17:52:49
这段代码有一些问题:
1. 没有包含所需的头文件。
2. 定义了两个相同的结构体opnds和optrs,可以只定义一个结构体用于存放栈。
3. Push函数和Pop函数中没有正确地处理栈顶元素的赋值。

下面是修正后的代码:
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <stdbool.h>

  4. #define MaxSize 50

  5. typedef struct            
  6. {
  7.     char data[MaxSize];
  8.     int top;
  9. } Stack;

  10. void Init_Stack(Stack *&S)  
  11. {
  12.     S = (Stack *)malloc(sizeof(Stack));
  13.     S->top = -1;
  14. }

  15. bool Push(Stack *&S, char e)  
  16. {
  17.     if(S->top == MaxSize - 1)
  18.         return false;
  19.     S->top++;
  20.     S->data[S->top] = e;
  21.     return true;
  22. }

  23. bool Pop(Stack *&S, char &e)  
  24. {
  25.     if(S->top == -1)
  26.         return false;
  27.     e = S->data[S->top];
  28.     S->top --;
  29.     return true;
  30. }

  31. bool GetTop(Stack *&S, char &e)  
  32. {
  33.     if(S->top == -1)
  34.         return false;
  35.     e = S->data[S->top];
  36.     return true;
  37. }

  38. bool Match(char *p)     
  39. {
  40.     int i;
  41.     Stack *S;
  42.     char topChar;
  43.    
  44.     Init_Stack(S);
  45.     for(i = 0; p[i] != '\0'; i++)  
  46.     {
  47.         if(p[i] == '(')
  48.         {
  49.             Push(S, p[i]);   // 将左括号入栈
  50.         }
  51.         else if(p[i] == ')')
  52.         {
  53.             if(!Pop(S, topChar))   // 如果栈空,说明右括号没有匹配的左括号
  54.                 return false;
  55.         }
  56.     }
  57.     if(S->top != -1)
  58.         return false;
  59.     else
  60.         return true;
  61. }

  62. int main()
  63. {
  64.     char p[MaxSize];
  65.     int i;
  66.     printf("请输入算术运算表达式:\n");
  67.     gets(p);

  68.     if(Match(p))
  69.         printf("括号匹配成功!\n");
  70.     else
  71.         printf("括号匹配失败!\n");

  72.     return 0;
  73. }
复制代码

这段代码实现了检查一个表达式中的括号是否匹配。根据输入的表达式,使用堆栈来检查左右括号的匹配情况。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-3-30 17:52:49 | 显示全部楼层    本楼为最佳答案   
这段代码有一些问题:
1. 没有包含所需的头文件。
2. 定义了两个相同的结构体opnds和optrs,可以只定义一个结构体用于存放栈。
3. Push函数和Pop函数中没有正确地处理栈顶元素的赋值。

下面是修正后的代码:
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <stdbool.h>

  4. #define MaxSize 50

  5. typedef struct            
  6. {
  7.     char data[MaxSize];
  8.     int top;
  9. } Stack;

  10. void Init_Stack(Stack *&S)  
  11. {
  12.     S = (Stack *)malloc(sizeof(Stack));
  13.     S->top = -1;
  14. }

  15. bool Push(Stack *&S, char e)  
  16. {
  17.     if(S->top == MaxSize - 1)
  18.         return false;
  19.     S->top++;
  20.     S->data[S->top] = e;
  21.     return true;
  22. }

  23. bool Pop(Stack *&S, char &e)  
  24. {
  25.     if(S->top == -1)
  26.         return false;
  27.     e = S->data[S->top];
  28.     S->top --;
  29.     return true;
  30. }

  31. bool GetTop(Stack *&S, char &e)  
  32. {
  33.     if(S->top == -1)
  34.         return false;
  35.     e = S->data[S->top];
  36.     return true;
  37. }

  38. bool Match(char *p)     
  39. {
  40.     int i;
  41.     Stack *S;
  42.     char topChar;
  43.    
  44.     Init_Stack(S);
  45.     for(i = 0; p[i] != '\0'; i++)  
  46.     {
  47.         if(p[i] == '(')
  48.         {
  49.             Push(S, p[i]);   // 将左括号入栈
  50.         }
  51.         else if(p[i] == ')')
  52.         {
  53.             if(!Pop(S, topChar))   // 如果栈空,说明右括号没有匹配的左括号
  54.                 return false;
  55.         }
  56.     }
  57.     if(S->top != -1)
  58.         return false;
  59.     else
  60.         return true;
  61. }

  62. int main()
  63. {
  64.     char p[MaxSize];
  65.     int i;
  66.     printf("请输入算术运算表达式:\n");
  67.     gets(p);

  68.     if(Match(p))
  69.         printf("括号匹配成功!\n");
  70.     else
  71.         printf("括号匹配失败!\n");

  72.     return 0;
  73. }
复制代码

这段代码实现了检查一个表达式中的括号是否匹配。根据输入的表达式,使用堆栈来检查左右括号的匹配情况。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-1 14:35

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表