季小寞 2022-11-18 08:39 采纳率: 75%
浏览 6
已结题

c语言栈的括号匹配问题

求指点迷津,代码是否有问题是否规范

#include<stdio.h>
#define SIZE 8
typedef char element;
typedef struct{
    element data[StackSize+1];//0号位不存储
    int base;
    int top;
}stack;
stack* createstack(stack *S);//构造栈
int push(stack* S, element e);//入栈
int pop(stack* S, element *e);//出栈
int length(stack* S);//若栈存在,求长度
int main(int argc, char* argv[]) {
    char brace[SIZE];//存储用户输入
    char ch;//读取输入
    int i;//记录输入的元素
    stack p;
    stack * Data = &p;
    createstack(Data);
    printf("输入括号(),{}.[],#结束\n");
    for (i = 0; i < SIZE; i++) {
        scanf("%c", &ch);
        if (ch == '#') break;
        brace[i] = ch;
    }
    for (int j = 0; j < i; j++) {
        if (brace[j] == '(' || brace[j] == '{' || brace[j] == '[') {
            push(Data, brace[j]);
        }
    }
    if (!length(Data)) {
        printf("栈空,匹配失败\n");
        return 0;
    }
    int index = 0;
    for (int j = 0; j < i; j++) {
        if (brace[j] == ')' || brace[j] == '}' || brace[j] == ']') {
            pop(Data, &ch);
            if (ch == '(' && brace[j] == ')') {
                index = 1;
            }
            else if (ch == '{' && brace[j] == '}') {
                index = 1;
            }
            else if (ch == '[' && brace[j] == ']') {
                index = 1;
            }
            else {
                index = 0;
            }
        }
    }
    if (length(Data)) {//使用求长度判断栈内是否有元素
        printf("匹配失败\n");
        return 0;
    }
    if (index) printf("匹配成功");
    else printf("匹配失败");
    return 0;
}

stack* createstack(stack* S){
    S->data[0] = 0;
    S->top =  1;
    S->base = 1;
    return S;
}
int push(stack* S, element e) {
    if (S == NULL) {
        printf("栈不存在\n");
        return 0;
    }
    if (S->top - S->base == StackSize) {//栈满
        return 0;
    }
    S->data[S->top] = e;
    S->top++;
    return 1;
}
int pop(stack* S, element *e) {
    if (S == NULL) {
        printf("栈不存在\n");
        return 0;
    }
    if (S->top == S->base) {
        printf("栈空\n");
        return 0;
    }
    S->top--;
    *e = S->data[S->top];
    return 1;
}
int length(stack* S) {
    return S->top -1;//栈空,base = top = 1,则长度为0
}

  • 写回答

2条回答 默认 最新

  • 赵4老师 2022-11-18 09:27
    关注

    仅供参考:

    #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);
    }
    
    
    
    
    本回答被专家选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 11月29日
  • 专家已采纳回答 11月21日
  • 创建了问题 11月18日

悬赏问题

  • ¥15 求解决为什么json数据完整,却解析失败
  • ¥15 打开Smart schedule运行examples/transformer-xl/scripts/run_enwik8_base_moe.sh 报错
  • ¥15 求一个C# sm4 加密解密的代码
  • ¥15 想做个网络加速器,怎么实现
  • ¥20 centos7下载mysql提示DNS解析异常
  • ¥20 vx转账功能对方不能领取
  • ¥15 vue2+codemirror 运行后页面光标太大了
  • ¥15 pdfjs库如何在前端实现打印、旋转等功能
  • ¥15 combobox数据绑定问题
  • ¥15 maven打包时,为什么有的依赖打不进去包