1808035990 发表于 2024-3-30 17:52:30

怎么修改

#include<stdio.h>
#include<stdlib.h>
#define MaxSize 50

typedef struct             //存放数字
{
        char data;
        int top;
}opnds;

typedef struct             //存放运算符
{
        char data;
        int top;
}optrs;

void Init_Stack(optrs *&S)//初始化栈
{
        S = (optrs *)malloc(sizeof(optrs));
        S->top = 0;
}

bool Push(optrs *&S,char e)//入栈
{
        if(S->top == MaxSize)
                return false;
        S->data = e;
        S->top ++;
        return true;
}

bool Pop(optrs *&S)//出栈
{
        char e;
        if(S->top == 0)
                return false;
        S->top --;
        e = S->data;
        return true;
}

bool GetTop(optrs *&S,char &e)//取栈顶元素
{
        if(S->top == 0)
                return false;
        e = S->data;
        return true;
}

bool Match(char *p)      //判断括号是否匹配
{
        int i,j = 0,d;
        optrs *S;
        if(p == '\0')
        {
                return true;
        }
        Init_Stack(S);
        for(i = 0;p != '\0';i ++)//遍历字符串
        {
                j = i;
                while(p >= '0' && p <= '9')
                {
                        d = d*10 + p - '0';
                        j ++;
                       
                }
                if(d != 0)
                {
                        opnds.data = d;
                        opnds.top ++;
                }
                i = j;
                if(('(' == p||')' == p)||('[' == p||']' == p)||('{' == p||'}' == p))
                {
                        if('(' == p||'[' == p||'{' == p)
                        {
                                Push(S,p);
                        }
                        else
                        {
                                char top;
                                GetTop(S,top);
                                if('(' == top && ')' == p||'[' == top && ']' == p||'{' == top && '}' == p)
                                {
                                        Pop(S);
                                }
                        }
                }
        if(S->top != 0)
                return false;
        else
                return true;
        }
}

int main()
{
        char p;
        int i;
        printf("请输入算术运算表达式:\n");
        for(i=0;i++;i<20)
        {
                scanf("%c",p);
        }
        if(Match(p))
                printf("匹配成功!\n");
        else
                printf("匹配失败!\n");
}

FishC 发表于 2024-3-30 17:52:49

这段代码有一些问题:
1. 没有包含所需的头文件。
2. 定义了两个相同的结构体opnds和optrs,可以只定义一个结构体用于存放栈。
3. Push函数和Pop函数中没有正确地处理栈顶元素的赋值。

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

#define MaxSize 50

typedef struct            
{
    char data;
    int top;
} Stack;

void Init_Stack(Stack *&S)
{
    S = (Stack *)malloc(sizeof(Stack));
    S->top = -1;
}

bool Push(Stack *&S, char e)
{
    if(S->top == MaxSize - 1)
      return false;
    S->top++;
    S->data = e;
    return true;
}

bool Pop(Stack *&S, char &e)
{
    if(S->top == -1)
      return false;
    e = S->data;
    S->top --;
    return true;
}

bool GetTop(Stack *&S, char &e)
{
    if(S->top == -1)
      return false;
    e = S->data;
    return true;
}

bool Match(char *p)   
{
    int i;
    Stack *S;
    char topChar;
   
    Init_Stack(S);
    for(i = 0; p != '\0'; i++)
    {
      if(p == '(')
      {
            Push(S, p);   // 将左括号入栈
      }
      else if(p == ')')
      {
            if(!Pop(S, topChar))   // 如果栈空,说明右括号没有匹配的左括号
                return false;
      }
    }
    if(S->top != -1)
      return false;
    else
      return true;
}

int main()
{
    char p;
    int i;
    printf("请输入算术运算表达式:\n");
    gets(p);

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

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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
页: [1]
查看完整版本: 怎么修改