鱼C论坛

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

[已解决]怎么修改

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

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

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

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

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

typedef struct             //存放运算符 
{
        char data[MaxSize];
        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[S->top] = e;
        S->top ++;
        return true;
}

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

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

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

int main()
{
        char p[20];
        int i;
        printf("请输入算术运算表达式:\n");
        for(i=0;i++;i<20)
        {
                scanf("%c",p[i]);
        }
        if(Match(p))
                printf("匹配成功!\n");
        else
                printf("匹配失败!\n");
}
最佳答案
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[MaxSize];
    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[S->top] = e;
    return true;
}

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

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

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

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

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

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

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

使用道具 举报

发表于 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[MaxSize];
    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[S->top] = e;
    return true;
}

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

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

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

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

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

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

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-22 19:48

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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