利用栈检测含{}、[]、{}的表达式子是否匹配(C语言)

题目:对于一个可能包括括号{}、[]、 ()的表达式,判定其中括号是否匹配

我们运用到了栈的重要思想:LIFO(后进先出)最后一个进栈的元素要第一个出来,这跟符号匹配的思想也是相同的,最后一个进来的前括号要先匹配好再出去

比如字符串: { [ ] }, 其中[ 后进入,要先出来,{先进入,要后出来。

提供的代码中isBalance中,依次读取字符串的每个字符,利用定义的current指针指向当前元素。

我们把前括号:(、 [ 、{ 压入栈中,如果读取到后括号)、]、},就定义一个topChar指针指向栈顶元素,检测当前current和topChar两个指针相匹配,就调用Pop函数弹出栈顶元素。

当全部元素均弹出时,我们调用isEmpty函数进行检测,如果栈为空,说明全部符号均匹配完成,返回true。

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

# define MAX_SIZE 100

//定义栈结构
typedef struct {
    int data[MAX_SIZE];
    int top;
}CharStack;

//初始化栈
void InitStack(CharStack *stack) {
    stack->top = -1;
}

//检查栈是否为空
bool isEmpty(CharStack *stack) {
    return stack->top == -1; //如果top指向-1就满足
}

//检查栈是否为满
bool isFull(CharStack *stack) {
    return stack->top == MAX_SIZE - 1;
}

//入栈操作
bool Push(CharStack *stack, char c) {
    if(isFull(stack)) {
        return false; //如果栈满,就返回false
    }
    stack->top++; //top指针向上移动
    stack->data[stack->top] = c; //将c赋给该元素
    return true;
}

//出栈操作
bool Pop(CharStack *stack) {
    if(isEmpty(stack)) {
        return false; //如果栈空,无法出栈
    }
    stack->top--; //top指针向下移动
    return true;

}

//判断括号是否匹配
//前符号满足栈的特性:后进先出
//重要思想:依次读取字符串中每一个字符,如果是前括号就Push入栈
//如果是后括号,就定义栈顶指针与其进行比较,匹配成功则将前括号出栈
//如果到最后比较完全部字符串都出栈,即满足isEmpty,就返回true
bool isBalanced(char *expression) {
    CharStack stack;
    InitStack(&stack);
    int length = strlen(expression); //存储表达式的长度

    for(int i = 0; i < length; i++) {
        char current = expression[i]; //把第i个字符串存储到current中
        //如果第i个字符是 ( [ { 任意一个,就将其Push到栈中
        if(current == '(' || current == '[' || current == '{') {
            Push(&stack, expression[i]);
        }
        else if(current == ')' || current == ']' || current == '}') {
            if(isEmpty(&stack)) {
                return false; //如果此时栈为空,则没有符号与其进行匹配,返回false
            }
            //定义一个栈顶指针存储栈顶元素数据
            char topChar = stack.data[stack.top];

            //检测是否三种符号都匹配
            if((current == ')' && topChar == '(') ||
              (current == ']' && topChar == '[') ||
              (current == '}' && topChar == '{')) {
                //如果匹配成功,就将栈顶元素Pop出栈
                Pop(&stack);
            }
            else {
                return false; //如果匹配不成功,则返回false
            }
        }
    }
    return isEmpty(&stack);//最后如果栈为空说明匹配成功
}
int main() {
    char expression[] = "{[()]()}"; //定义一个字符串数值,expression就为其首元素地址
    if(isBalanced(expression)) {
        printf("字符中括号全部匹配成功!");
    }
    else {
        printf("字符中括号匹配失败!");
    }
    return  0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值