美文网首页
数据结构与算法-括号匹配问题

数据结构与算法-括号匹配问题

作者: Joker_King | 来源:发表于2020-04-25 20:20 被阅读0次

定义一个栈

#define Stack_Init_Size 100
#define Stack_Increment 10
//栈的定义
typedef struct {
    char *base; //栈底指针
    char *top;  //栈顶指针
    int stacksize;  //栈MaxSize
}SqStack;

初始化栈

/*
 思路:
 1. 如果栈底为空
 2. 分配一个最大容量Stack_Init_Size的数组,栈底/栈顶都指向与它
 3. 初始化栈的最大容易Stack_Init_Size
 */
int Init(SqStack *stack){
        stack->base = (char*)malloc(Stack_Init_Size*sizeof(char));
        stack->top = stack->base;
        stack->stacksize = Stack_Init_Size;
}

获取栈顶数据

/*
 思路:
 1.判断栈是否为空
 2.非空,则栈定指针-1,返回栈顶元素;
 */
char GetTop(SqStack stack){   
    if(stack.base == stack.top){
        //printf("栈中没有数据\n");
        return '#';
    }
    //printf("获取栈顶数据成功\n");
    return *(stack.top - 1);
}

往栈中插入元素

/*
 思路:
 1.判断栈是否已满,若满则返回ERROR
 2.栈满,则续容空间
 3.将元素element压栈
 4.栈顶指针加"1"
 */
int Push(SqStack *stack,char element){
    //栈顶减去栈底==栈的大小,此时就是满栈
    if(stack->top-stack->base==stack->stacksize){
        //使用realloc重新分配内存大小,实现动态扩容
        stack->base = (char*)realloc(stack->base,Stack_Increment*sizeof(char));
        stack->top = stack->base + stack->stacksize;
        stack->stacksize += Stack_Increment;
    }
    *stack->top = element;
    stack->top += 1;
    return 0;
}

删除栈顶元素

/*
 思路:
 1.判断栈是否已空
 2.非空,则获取栈顶元素,并将栈顶减"1";
 */
char Pop(SqStack *stack){
    if(stack->top == stack->base){
        printf("栈为空\n");
        return '#';
    }
    //printf("删除数据成功");
    return *--stack->top;
}

释放栈空间

int Destroy(SqStack *stack){
    free(stack->base);
    stack->stacksize = 0;
    return 0;
}

括号匹配检验

假设表达式中允许包含两种括号:圆括号与方括号,其嵌套顺序随意,即() 或者[([][])]都是正确的.而这[(]或者(()])或者([()) 都是不正确的格式. 检验括号是否匹配的方法可用”期待的急迫程度"这个概念来描述.例如,考虑以下括号的判断: [ ( [ ] [ ] ) ]

image-20200425191539904

解题思路

  1. 将第0个元素压栈
  2. 遍历[1,strlen(data)]
  3. 取栈顶字符
  4. 检查该字符是左括号("(","[")
    • 是左"(",则判断紧接其后的data[i]是为右")" YES->出栈,NO->压栈
    • 是左"[",则判断紧跟其后的data[i]是为右"]" YES->出栈,NO->压栈
    • 表示式如果以"#"结尾,则判断紧跟其后的data是为左"(""[" YES->出栈,NO->-1;
  5. 遍历结束,则判断栈是否为空,为空则表示匹配成功;否则匹配失败;

代码实现

int ExecuteData(SqStack stack,char* data){
    Push(&stack,data[0]);
    for(int i=1;i<strlen(data);i++){
        char top = GetTop(stack);
        switch(top){
            case '(':
                if(data[i]==')')Pop(&stack);
                else Push(&stack,data[i]);
                break;
            case '[':
                if(data[i]==']')Pop(&stack);
                else Push(&stack,data[i]);
                break;
            case '#':
                if(data[i]=='('||data[i]=='['){
                    Push(&stack,data[i]);
                    break;
                } else { 
                    default:return -1;break;
                }
        }
    }
    
    //如果栈为空,则返回"0"->匹配成功 否则返回"-1"匹配失败
    if(stack.top==stack.base){
        Destroy(&stack);
        return 0;
    } else {
        Destroy(&stack);
        return -1;
    }
}

相关文章

  • 3. 一些算法问题

    1. 括号匹配问题 算法:括号匹配问题 - 简书 C程序括号匹配检查 - Jason ZHANG的博客 - CSD...

  • 数据结构与算法-括号匹配问题

    定义一个栈 初始化栈 获取栈顶数据 往栈中插入元素 删除栈顶元素 释放栈空间 括号匹配检验 假设表达式中允许包含两...

  • 算法:括号匹配问题

    还记得有一次笔试题,有一道括号匹配的算法题,当时没有学习数据结构和算法,思路很模糊,后来了解一些数据结构之后就有思...

  • 字符串匹配算法

    以下为学习 《数据结构与算法之美 -- 字符串匹配》 的记录。 BF算法 即暴力匹配算法,循环遍历匹配。 RK算法...

  • 【数据结构】【C#】010-栈的应用:🌜🌛括号匹配

    C#数据结构:栈的应用:括号匹配问题 假设表达式中包含三种括号:圆括号、方括号和花括号,它们可互相嵌套,如 ( [...

  • 数据结构与算法 习题2

    1.括号匹配检验: (字节出现过的算法⾯试题/LeetCode) 假设表达式中允许包含两种括号:圆括号与⽅括号,其...

  • 算法---括号匹配

    给一个括号字符串序列,判断所有的括号是否匹配

  • 20. Valid Parentheses

    使用栈数据结构: 遇到左括号,需要压栈。 遇到右括号,判断栈顶是否和当前右括号匹配;若不匹配则返回false,否则...

  • 最长括号匹配

    问题描述 给定字符串,仅包含左括号和右括号,设计算法,找出最长匹配的括号子串,返回该子串的长度。 如: ( ( )...

  • 数据结构与算法——基础篇(一)

    前置问题 经典问题与算法 8皇后问题(92种摆法)——回溯算法 字符串匹配问题——KMP算法(取代暴力匹配) 汉诺...

网友评论

      本文标题:数据结构与算法-括号匹配问题

      本文链接:https://www.haomeiwen.com/subject/ueqlwhtx.html