C语言解决堆栈符号匹配问题示例详解---用链栈

#include<stdio.h>
#include<stdbool.h>
#include<stdlib.h>
#define Maxsize 10
//用链栈

typedef struct LinkNode{
    char data; // 数据域
    struct LinkNode* next; //指针域
    int num;//栈中元素个数
}LinkNode;

typedef struct{
    LinkNode* rear;
}LinkStack;

//初始化链栈 带头指针
 bool InitStack(LinkStack *L){

     L->rear = L->front = (LinkNode*) malloc(sizeof(LinkNode));//使shou
     L->rear->next = NULL;//c语言中的null一定要大写
     L->rear->num = 0;
    
    return true;
 }

//判断是否为空栈
bool  StackEmpty(LinkStack *L){
    return L->rear->num==0;
}

//进栈
bool Push(LinkStack *L,char str){
    // LinkNode* s =(LinkNode*)malloc(sizeof(LinkNode));//建立新结点
     LinkNode* s = (LinkNode*) malloc(sizeof(LinkNode));
     s->data = str;
     s->next = NULL;
     L->rear->next = s;//链接尾节点
     L->rear = s;//使尾指针指向新的尾节点
     L->rear->num++;//栈中元素加一
    return true;
     
}
//出栈
bool Pop(LinkStack *L,char * top){
    if(L->rear->num==0){return false;}
    *top = L->rear->data;//返回尾节点的元素
    //寻找最后第二个节点
    LinkNode *p = L->front;//指针p指向头节点
    int i = L->rear->num;//当前栈中元素数量
    int j = 0;
    while(p!=NULL&& j < i -1){
        p = p->next;
        j++       ;          //
    }
    if(p==NULL){return false ; }
    LinkNode *q = L->rear;//新指针指向尾节点
    L->rear->num--;//栈中元素数量减一
    L->rear = p;//尾指针指向倒数第二个节点
    p->next = NULL;
    free(q);//释放尾节点
    
    
    return true;

}

bool match(char str[]){
    LinkStack L;//声明一个结构体
    InitStack(&L);//初始化结构体
    for(int i = 0 ; i < Maxsize ; i++){
        if(str[i]=='('||str[i]=='['||str[i]=='{'){
            Push(&L,str[i]);//进栈
        }else{
            char top;
            Pop(&L ,&top);
            if(str[i]=='('&& top!=')'){ return false;}
            if(str[i]=='['&& top!=']'){ return false;}
            if(str[i]=='{'&& top!='}'){ return false;}

        }
    }
    
    return StackEmpty(&L);
}
                     
int main()
{
    
    char str[Maxsize] = {'(','(',')','{','}','[',']',')','{','}'};
    
    
    if(match(str)){
        printf("匹配成功");
    }else{
        printf("匹配不成功");
    }
    
   
   return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值