C语言栈——经典括号匹配问题

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

struct stack {
    char* p;
    int size;
    int capacity;
};
struct stack ST;
void Init(stack* s){
    s->p = NULL;
    s->capacity = s->size = 0;
}
void newcapacity(stack* s) {
    if (s->capacity == 0) {
        s->capacity += 4;
        s->p = (char*)malloc(4 * sizeof(char));
    }
    else {
        s->capacity *= 2;
        int* item = (int*)realloc(s->p, (s->capacity) * sizeof(char));
    }
}
void Push(stack* s, char item) {
    s->p[s->size++] = item;
}
void Del(stack* s, char item,int* flag,int*makk) {
    //相同出栈
    if(item==']'&&s->p[s->size-1]=='['){//
        s->p[--s->size] = '\0';
        *flag= 1;
        *makk = 1;
    }
    else if (item == ')' && s->p[s->size - 1]=='(') {
        s->p[--s->size] = '\0';
        *flag = 1;
        *makk = 1;
    }
    else if(item == '}'&&s->p[s->size - 1] == '{'){
        s->p[--s->size] = '\0';
        *flag =1;
        *makk = 1;
    }
    else {
        s->p[s->size++] = item;
        *flag = 0;
    }
}
int Judge(stack* s, char item) {
    if (item == ']'&&s->p[s->size - 1] == '[') {//
        s->p[--s->size] = '\0';//将相对应的字符串置为'\0'
        return 1;
    }
    else if (item == ')' && s->p[s->size - 1] == '(') {
        s->p[--s->size] = '\0';
        return 1;
    }
    else if (item == '}'&&s->p[s->size - 1] == '{') {
        s->p[--s->size] = '\0';
        return 1;
    }
    else {
        return 0;
    }
}
int main() {
    char item;
    char arr[20];
    int flag = 0;//作用是用来进入另一个后面一个与item是否相等的函数
    int makk = 0;//作用是看最后能不能进入到后面的判断
    Init(&ST);
    gets_s(arr);
    int len = strlen(arr);
    for (int i = 0; i < len; i++) {
        item = arr[i];
        if (item == '(' || item == '[' || item == '{'||item == ')' || item == ']' || item == '}') {
            //能否扩容
            if (ST.capacity == ST.size) {
                newcapacity(&ST);
            }
            //入栈操作
            if (i == 0) {//第一个就直接放进去
                Push(&ST, item);
            }
            else {//其他的该判断与前一个是否相等了,不相等就加入,相等就出栈
            
                if (flag == 1&&ST.size!=0) {//sizeof!=0是为了item要与ST.p[]中的最后一个字符串做对比
                    //开始判断
                    if (Judge(&ST, item)) {
                        makk = 1;
                        continue;
                    }
                    else {
                        makk = 0;//一旦遇到与ST.p[]最后一个不相等的,直接退出循环
                        break;
                    }
                }
                else {
                    Del(&ST, item,&flag,&makk);//已经包含了有关判断item与ST最后一个符号是否相等
                    //flag的的作用是能为了进入Judge函数
                    //makk的作用是解决''(){}[]''这类的的问题
                }
            }
        }
    }
    if (makk == 0) {
        printf("NO\n");
    }else{
        printf("YES\n");
    }
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值