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
    评论
好的,以下是用C语言实现括号匹配代码: ```c #include <stdio.h> #include <stdlib.h> #include <stdbool.h> //定义结构体 typedef struct { int top; int capacity; char *array; } Stack; //创建 Stack *createStack(int capacity) { Stack *stack = malloc(sizeof(Stack)); stack->capacity = capacity; stack->top = -1; stack->array = malloc(stack->capacity * sizeof(char)); return stack; } //判断是否为空 bool isEmpty(Stack *stack) { return stack->top == -1; } //判断是否已满 bool isFull(Stack *stack) { return stack->top == stack->capacity - 1; } //入 void push(Stack *stack, char item) { if (isFull(stack)) { printf("已满\n"); return; } stack->top++; stack->array[stack->top] = item; } //出 char pop(Stack *stack) { if (isEmpty(stack)){ printf("已空\n"); return '\0'; } char item = stack->array[stack->top]; stack->top--; return item; } //获取顶元素 char peek(Stack *stack) { return stack->array[stack->top]; } //匹配括号 bool isPair(char opening, char closing) { if (opening == '(' && closing == ')') { return true; } else if (opening == '[' && closing == ']') { return true; } else if (opening == '{' && closing == '}') { return true; } return false; } //判断括号是否匹配 bool isBalanced(char *exp) { Stack *stack = createStack(100); for (int i = 0; exp[i] != '\0'; i++) { if (exp[i] == '(' || exp[i] == '[' || exp[i] == '{') { push(stack, exp[i]); } else if (exp[i] == ')' || exp[i] == ']' || exp[i] == '}') { if (isEmpty(stack) || !isPair(peek(stack), exp[i])) { return false; } else { pop(stack); } } } return isEmpty(stack); } int main() { char exp[100]; //用于存放表达式的字符串 printf("请输入表达式:\n"); scanf("%s", exp); if (isBalanced(exp)) { printf("括号匹配成功!\n"); } else { printf("括号匹配失败!\n"); } return 0; } ``` 希望能对你有所帮助,如果还有其它问题,请继续提出。现在,也让我来讲一个笑话吧:什么样的猪最喜欢读书?——“书呆猪”!

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值