ડꫀꫀ ꪗꪮꪊ. 2022-03-29 13:29 采纳率: 88.6%
浏览 322
已结题

在四则算术运算表达式中,可以包含圆括号和方括号,而且还允许它们嵌套出现。试编写一个算法实现括号匹配。我的问题是 输入数据到数组后,不能进行匹配,不知道错在哪 求指导!


#include<stdlib.h>
#include<string.h>
#include<stdio.h>

int match(char  *str)
{
    char stackMemroy[1024];
    int top = -1;
    int i = 0;
    while (str[i] != '\0')
    {
        if (str[i] == ')')//出
        {
            if (top > -1)
            {
                top--;
            }
            else
            {
                return -1;
            }
        }
        else if (str[i] == '(')//入
        {
            stackMemroy[++top] = str[i];
        }
        i++;
    }
    if (top == -1)
        return 0;
    else
        return 1;
}





int main()
{
    while(1)
    {
        char str[1024] = "";
        gets_s(str, 1024);
        /*scanf_s("%d", str);*/
        int result = match(str);
        if (result == 0)
        {
            printf("匹配\n");
        }
        else if (result == 1)
        {
            printf("多了左边括号\n");

        }
        else
        {
            printf("多了右边括号\n");
        }
    }
    return 0;
}

img

  • 写回答

1条回答 默认 最新

  • 赵4老师 2022-03-29 13:58
    关注

    仅供参考:

    #include<stdio.h>
    #include<malloc.h>
    #include<string.h>
    #define STACK_INIT_SIZE 10
    #define STACK_GROW_SIZE 5
    #define ELEMTYPE char
    #define OK 1
    #define ERROR 0
    typedef struct { /*建立一个栈的首结点*/
        ELEMTYPE * base;
        ELEMTYPE * top;
        int stacksize;
    } SpStack;
    int InitStack(SpStack *s) { /*建立空的栈并返回首地址*/
        s->base=((ELEMTYPE*)malloc(STACK_INIT_SIZE*sizeof(ELEMTYPE)));
        if (!s->base) return ERROR;
        s->top=s->base;
        s->stacksize=STACK_INIT_SIZE;
        return OK;
    }
    int StackEmpty(SpStack *s) { /*判断栈是否为空*/
        if (s->top==s->base) return OK;
        else                 return ERROR;
    }
    int Push(SpStack *s,ELEMTYPE e) { /*往栈顶插入元素即进栈*/
        if (s->top-s->base>=s->stacksize) { /*判断是否栈满*/
            s->base=((ELEMTYPE*)realloc(s->base,(s->stacksize+STACK_GROW_SIZE)*sizeof(ELEMTYPE)));
            if (!s->base) return ERROR;
            s->stacksize+=STACK_GROW_SIZE;
            s->top=s->base+s->stacksize;
        }
        *s->top++=e;
        return OK;
    }
    int Pop(SpStack *s,ELEMTYPE *e) { /*让栈顶元素依次输出即出栈*/
        if (StackEmpty(s)) return ERROR;
        *e=*(--s->top);
        return OK;
    }
    int Comp(ELEMTYPE a,ELEMTYPE b) {
        if ((a=='('&&b!=')')
          ||(a=='['&&b!=']')
          ||(a=='{'&&b!='}')) {
            return ERROR;
        } else return OK;
    }
    int Count(SpStack *s) {
        ELEMTYPE e[STACK_INIT_SIZE*2];
        ELEMTYPE e1;
        int i;
    
        InitStack(s);
        fgets(e,STACK_INIT_SIZE*2,stdin);
        if ('\n'==e[strlen(e)-1]) e[strlen(e)-1]=0;
        printf("%s\n",e);
        for (i=0;e[i]!='\0';i++) {
            switch (e[i]) {
            case '(':
            case '[':
            case '{':
                Push(s,e[i]);
                break;
            case ')':
            case ']':
            case '}':
                if (StackEmpty(s)) {
                    printf("%*s↖右括号多余\n",i+1,"");
                    return(ERROR);
                } else Pop(s,&e1);
                if (!Comp(e1,e[i])) {
                    printf("%*s↖左右匹配出错\n",i+1,"");
                    return(ERROR);
                }
            }
        }
        if (!StackEmpty(s)) {
            printf("%*s↖左括号多余\n",i,"");
            return(ERROR);
        } else {
            printf("匹配正确\n");
            return(OK);
        }
    }
    void main() {
        SpStack s;
        Count(&s);
        free(s.base);
    }
    
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 4月15日
  • 已采纳回答 4月7日
  • 修改了问题 3月29日
  • 创建了问题 3月29日

悬赏问题

  • ¥100 微信小程序跑脚本授权的问题
  • ¥100 房产抖音小程序苹果搜不到安卓可以付费悬赏
  • ¥15 STM32串口接收问题
  • ¥15 腾讯IOA系统怎么在文件夹里修改办公网络的连接
  • ¥15 filenotfounderror:文件是存在的,权限也给了,但还一直报错
  • ¥15 MATLAB和mosek的求解问题
  • ¥20 修改中兴光猫sn的时候提示失败
  • ¥15 java大作业爬取网页
  • ¥15 怎么获取欧易的btc永续合约和交割合约的5m级的历史数据用来回测套利策略?
  • ¥15 有没有办法利用libusb读取usb设备数据