数据结构——栈

使用栈感想:判断栈空与否的条件应该写成stack->top->next!=NULL,不容易出错

附上括号匹配的代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct list{
    char num;
    struct list*next;
}list;

typedef struct stack{
    list*top;
    list*bottom;
}stack;

void init(stack*pstack){
    pstack->bottom=(list*)malloc(sizeof(list));
    if(pstack->bottom==NULL){
        printf("内存分配失败");
    }
    else{
        pstack->top=pstack->bottom;
        pstack->bottom->next=NULL;
    }
}

void push(stack*pstack,char value){
    list*pnew=(list*)malloc(sizeof(list));
    pnew->num=value;
    pnew->next=pstack->top;
    pstack->top=pnew;
}

void pop(stack*pstack){
    list*p;
    p=pstack->top;
    pstack->top=pstack->top->next;
    free(p);
}

int main(){
    stack*s;//s就是栈
    s=(stack*)malloc(sizeof(stack));
    char a[100];
    char sign[30];
    scanf("%s",a);
    int i=0;
    int j=0;
    for(i=0;i<strlen(a);i++){
        if(a[i]=='{'||a[i]=='['||a[i]=='('||a[i]=='}'||a[i]==']'||a[i]==')'){
            sign[j]=a[i];
            j++;
        }
    }
    init(s);
    int k=0;//k用来避免匹配失败还输出匹配成功 
    for(i=0;i<strlen(sign);i++){
        //压栈操作 
        if(sign[i]=='{'||sign[i]=='['||sign[i]=='('){
            push(s,sign[i]);
        }
        //出(括号 
        if(sign[i]==')'){
            if(s->top->num=='('){
                pop(s);
            }
            else{
                k++;
                printf("缺少(括号");
            }
        }
        //出【括号 
        if(sign[i]==']'){
            if(s->top->num=='['){
                pop(s);
            }
            else{
                k++;
                printf("缺少[括号"); 
            }
        }
        //出{括号
        if(sign[i]=='}'){
            if(s->top->num=='{'){
                pop(s);
            }
            else{
                k++;
                printf("缺少{括号");
            }
        } 
    }
    if(s->top->next!=NULL){
        printf("缺少}括号");
    }
    else if(s->top==s->bottom&&k==0){
        printf("匹配成功");
    }
    return 0; 
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值