C语言 数据结构--栈 括号匹配算法

这篇具有很好参考价值的文章主要介绍了C语言 数据结构--栈 括号匹配算法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

今天这一期使用栈来完成括号匹配算法

① 栈结构

typedef struct
{
    char elem[Stack_Size];
    int  top;
}SeqStack;

② 初始化栈

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

③ 入栈

int Push(SeqStack* S, char x)  //入栈
{
    if (S->top == Stack_Size - 1) return False;    //如果栈顶指针等于栈的最大容量减一,说明栈已满,返回False
    S->top++;                                      //否则,将栈顶指针加一
    S->elem[S->top] = x;                           //将x赋值给栈顶元素
    return True;
}

④ 出栈

int Pop(SeqStack* S, char* x)  //出栈
{
    if (S->top == -1) return False;     //如果栈顶指针为-1,说明栈为空,返回False
    else
    {
        *x = S->elem[S->top];          //否则,将栈顶元素赋值给x指向的变量
        S->top--;                     //将栈顶指针减一
        return True;
    }
}

⑤ 判断栈是否为空

int IsEmpty(SeqStack* S)   //判断栈是否为空
{
    if (S->top == -1)     //如果栈顶指针为-1,说明栈为空
    {
        return True;    //返回True
    }
    else                 //否则,栈不为空
    {
        return False;   //返回False
    }
}

⑤ 括号匹配

int BracketMatch(char *x)   //括号匹配
{
    SeqStack S;                      //定义一个顺序栈S
    InitStack(&S);                   //初始化栈S
    int len = strlen(x);        //获取字符串x的长度
    for(int i = 0;i < len;i++)       //遍历字符串x中的每个字符
    {
        if(x[i]=='['||x[i]=='{'||x[i]=='(')           //如果字符是左括号
        {
            Push(&S,x[i]);                   //将左括号入栈
        }
        else                              //如果字符是右括号
        {
            if(IsEmpty(&S))              //如果栈为空,说明没有匹配的左括号,返回False
                return False;

            char ch;                     //定义一个字符变量ch
            Pop(&S,&ch);                 //将栈顶元素出栈,并赋值给ch
            if(x[i]==')' && ch!='(')     //如果右括号是')',但栈顶元素不是'(',说明不匹配,返回False
                return False;
            if(x[i]==']' && ch!='[')     //如果右括号是']',但栈顶元素不是'[',说明不匹配,返回False
                return False;
            if(x[i]=='}' && ch!='{')    //如果右括号是'}',但栈顶元素不是'{',说明不匹配,返回False
                return False;

        }
    }
    return IsEmpty(&S);       //遍历完字符串后,如果栈为空,说明所有括号都匹配,返回True;否则,返回False
}

完整代码:

#include "stdio.h"
#include <string.h>
#define False 0
#define True 1
#define Stack_Size 50

typedef struct
{
    char elem[Stack_Size];
    int  top;
}SeqStack;

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

int Push(SeqStack* S, char x)  //入栈
{
    if (S->top == Stack_Size - 1) return False;    //如果栈顶指针等于栈的最大容量减一,说明栈已满,返回False
    S->top++;                                      //否则,将栈顶指针加一
    S->elem[S->top] = x;                           //将x赋值给栈顶元素
    return True;
}

int Pop(SeqStack* S, char* x)  //出栈
{
    if (S->top == -1) return False;     //如果栈顶指针为-1,说明栈为空,返回False
    else
    {
        *x = S->elem[S->top];          //否则,将栈顶元素赋值给x指向的变量
        S->top--;                     //将栈顶指针减一
        return True;
    }
}

int IsEmpty(SeqStack* S)   //判断栈是否为空
{
    if (S->top == -1)     //如果栈顶指针为-1,说明栈为空
    {
        return True;    //返回True
    }
    else                 //否则,栈不为空
    {
        return False;   //返回False
    }
}

int GetPop(SeqStack* S, char* x)       //获取栈顶元素
{
    if (S->top == -1) return False;   //如果栈顶指针为-1,说明栈为空,返回False
    else
    {
        *x = S->elem[S->top];        //否则,将栈顶元素赋值给x指向的变量
        return (True);               //返回True
    }
}
void Stack_display(SeqStack *S) //显示栈元素
{
    if (S->top == -1)                       //如果栈顶指针为-1,说明栈为空
    {
        printf("栈为空\n");          //打印提示信息
        return; //结束函数
    }

    printf("栈中的元素: ");                //打印提示信息
    for (int i = S->top; i >= 0; i--)           //从栈顶到栈底遍历栈中的元素
    {
        printf("%c ", S->elem[i]);       //打印每个元素,用空格隔开
    }
    printf("\n");
}

int BracketMatch(char *x)   //括号匹配
{
    SeqStack S;                      //定义一个顺序栈S
    InitStack(&S);                   //初始化栈S
    int len = strlen(x);        //获取字符串x的长度
    for(int i = 0;i < len;i++)       //遍历字符串x中的每个字符
    {
        if(x[i]=='['||x[i]=='{'||x[i]=='(')                //如果字符是左括号
        {
            Push(&S,x[i]);                              //将左括号入栈
        }
        else                             //如果字符是右括号
        {
            if(IsEmpty(&S))             //如果栈为空,说明没有匹配的左括号,返回False
                return False;

            char ch;                    //定义一个字符变量ch
            Pop(&S,&ch);             //将栈顶元素出栈,并赋值给ch
            if(x[i]==')' && ch!='(')    //如果右括号是')',但栈顶元素不是'(',说明不匹配,返回False
                return False;
            if(x[i]==']' && ch!='[')    //如果右括号是']',但栈顶元素不是'[',说明不匹配,返回False
                return False;
            if(x[i]=='}' && ch!='{')   //如果右括号是'}',但栈顶元素不是'{',说明不匹配,返回False
                return False;

        }
    }
    return IsEmpty(&S);       //遍历完字符串后,如果栈为空,说明所有括号都匹配,返回True;否则,返回False
}

int main()
{
    SeqStack S;
    char str[]={'(','{','[',']','}',')'};   //可以更换成其他括号序列
    char str1[]={'(','}'};                  //可以更换成其他括号序列
    InitStack(&S);
    if(BracketMatch(&str))
    {
        printf("匹配成功!");
    }
    else
    {
        printf("匹配失败!");
    }
    return 0;
}

结果:

(1)括号序列为char str[]={'(','{','[',']','}',')'};

括号匹配问题 栈c语言,数据结构,c语言,c++,算法

括号匹配问题 栈c语言,数据结构,c语言,c++,算法

(2)括号序列为char str1[]={'{','(','}',']'};

 括号匹配问题 栈c语言,数据结构,c语言,c++,算法

 括号匹配问题 栈c语言,数据结构,c语言,c++,算法文章来源地址https://www.toymoban.com/news/detail-744089.html

到了这里,关于C语言 数据结构--栈 括号匹配算法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 数据结构课设:基于字符串模式匹配算法的病毒感染检测问题

    1.掌握字符串的顺序存储表示方法。 2.掌握字符串模式匹配算法BF算法或KMP算法的实现。 问题描述 医学研究者最近发现了某些新病毒,通过对这些病毒的分析,得知它们的DNA序列都是环状的。现在研究者已收集了大量的病毒DNA和人的DNA数据,想快速检测出这些人是否感染了

    2023年04月27日
    浏览(35)
  • 【数据结构】顺序栈的基本操作:出栈、入栈、取栈顶元素、输出所有栈中元素、括号匹配题目

    栈是限定仅在表位进行插入或删除操作的线性表。栈的表尾称为栈顶,表头称为栈底。不含元素的栈称为空栈。 左图为栈的示意图,右图为用铁路调度表示栈。 如下是入栈至栈满再进行出栈的过程示意图。值得注意的是,栈满后,top指针指向的不是顶端元素,而是顶端的下

    2024年02月07日
    浏览(37)
  • C语言数据结构+KMP算法next数组优化计算方法+优化后子串匹配代码实现

    通过我之前那篇KMP算法的讲解,我们可以快速手算KMP算法的next数组,但是之前计算的next数组在一些情况下会有缺陷,比如模式串’aaaab’和主串’aaabaaaab’进行匹配 令模式串指针为j 当第一个元素不匹配时,下一次匹配还是要从模式串的第一个元素与主串匹配,其实我们可以直接写

    2024年02月06日
    浏览(33)
  • 【数据结构】C语言实现顺序栈 && OJ题 —— 有效的括号

    👑作者主页:@进击的安度因 🏠学习社区:进击的安度因(个人社区) 📖专栏链接:数据结构

    2024年02月10日
    浏览(33)
  • 【数据结构与算法】6、栈(Stack)的实现、LeetCode:有效的括号

    🌱 栈 是一种特殊的线性表, 只能在一端进行操作 🌱 往栈中 添加 元素的操作,一般叫做 push ( 入栈 ) 🌱 从栈中 移除 元素的操作,一般叫做 pop ,出栈(只能移除栈顶元素),也叫做: 弹出栈顶元素 🌱 后进先出 的原则, L ast I n F irst O ut, LIFO 注意:这里的 栈 与内

    2024年02月13日
    浏览(24)
  • C语言经典算法之括号匹配算法

    目录 前言 A.建议 B.简介 一 代码实现 二 时空复杂度 A.时间复杂度分析 B.空间复杂度分析 三 优缺点 A.优点: B.缺点: 四 现实中的应用 1.学习算法最重要的是理解算法的每一步,而不是记住算法。 2.建议读者学习算法的时候,自己手动一步一步地运行算法。 tips:文中的(如

    2024年02月21日
    浏览(25)
  • 数据结构与算法之字符串: Leetcode 20. 有效的括号 (Typescript版)

    有效的括号 https://leetcode.cn/problems/valid-parentheses/ 描述 给定一个只包括 ‘(’,‘)’,‘{’,‘}’,‘[’,‘]’ 的字符串 s ,判断字符串是否有效。 有效字符串需满足: 左括号必须用相同类型的右括号闭合。 左括号必须以正确的顺序闭合。 每个右括号都有一个对应的相

    2024年02月01日
    浏览(34)
  • 《数据结构、算法与应用C++语言描述》-列车车厢重排问题

    完整可编译运行代码见:Github::Data-Structures-Algorithms-and-Applications/_10Train_carriages_rearrangement/ 一列货运列车有 n 节车厢,每节车厢要停靠在不同的车站。假设 n个车站从 1 到n 编号,而且货运列车按照从n到1的顺序经过车站。车厢的编号与它们要停靠的车站编号相同。为了便于从

    2024年04月10日
    浏览(45)
  • C语言数据结构——图的最短路径算法解决实例问题

    一、问题描述 W公司在某个地区有6个产品销售点,现根据业务需要打算在其中某个销售点上建立一个中心仓库,负责向其他销售点提供产品。由于运输线路不同,运输费用也不同。假定每天需要向每个销售点运输一次产品,那么应将中心仓库建在哪个销售点上,才能使运输费

    2024年02月08日
    浏览(36)
  • 【数据结构】朴素模式匹配 & KMP算法

    🌈 自在飞花轻似梦,无边丝雨细如愁 🌈   🌟 正式开始学习数据结构啦~此专栏作为学习过程中的记录 🌟 子串的定位操作通常称为串的模式匹配,它求的是模式串在主串中的位置,而朴素模式匹配就是一种不断移动主串指针,每一次都和模式串依次进行比较的暴力求解方法

    2024年02月16日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包