【数据结构】括号匹配问题(简单版)

该文章介绍了如何使用C语言实现括号匹配问题,通过定义链表结构的栈数据结构进行匹配检查。文章提供了完整的代码示例,并在主函数中读取用户输入的括号表达式进行测试。读者可以通过这个例子学习到栈在解决此类问题中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

⭐️写在前面的话⭐️

📒博客主页: 程序员好冰
🎉欢迎 【点赞👍 关注🔎 收藏⭐️ 留言📝】
📌本文由 程序员好冰 原创,优快云 首发!
📆入站时间: 🌴2022 年 07 月 13 日🌴
✉️ 是非不入松风耳,花落花开只读书。
💭推荐书籍:📚《Java编程思想》,📚《Java 核心技术卷》
💬参考在线编程网站:🌐牛客网🌐力扣
🍭 作者水平很有限,如果发现错误,一定要及时告知作者哦!感谢感谢!🍭


括号匹配问题

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

#define OK 1
#define ERROR 0
#define MAX_SIZE 100

typedef int Status;
typedef int ElemType;

typedef struct LNode
{
    ElemType data;
    struct LNode *next;
}LNode;

typedef struct LinkStack
{
    int count;
    LNode *top;
}LinkStack;

Status InitStack(LinkStack *L)
{
    L->top=(LNode*)malloc(sizeof(LNode));
    if(!L->top){
        return ERROR;
    }
    L->top=NULL;
    L->count=0;
    return OK;
}

Status StackIsEmpty(LinkStack L)
{
    if(L.count==0){
        return OK;
    }
    if(L.count!=0){
        return ERROR;
    }
    return OK;
}

int StackLength(LinkStack L)
{
    return L.count;
}

ElemType GetTop(LinkStack L)
{
    return L.top->data;
}

Status Push(LinkStack *L,ElemType e)
{
    LNode *s = (LNode*)malloc(sizeof(LNode));
    s->data=e;
    s->next=L->top;
    L->top=s;
    L->count++;
    return OK;
}

Status Pop(LinkStack *L)
{
    if(StackIsEmpty(*L)){
        return ERROR;
    }
    LNode *temp;
    temp=L->top;
    L->top=L->top->next;
    free(temp);
    L->count--;
    return OK;
}

Status PrintStack(LinkStack L)
{
    if(StackIsEmpty(L)){
        return ERROR;
    }
    while(L.top){
        printf("%d",L.top->data);
        L.top=L.top->next;
    }
    return OK;
}

Status Matching(char *ch)
{
    LinkStack L;
    InitStack(&L);
    int flag=1;//默认匹配成功
    int i=0;
    int len = strlen(ch);
    while(i<len)
    {
        switch(ch[i])
          {
            case '[':
            case '(':
            case '{':
                Push(&L,ch[i]);
                break;
            case ')':
                if(!StackIsEmpty(L)&&GetTop(L)=='('){
                    Pop(&L);
                   }else
                   {
                       flag=0;
                   }
                break;
            case ']':
                if(!StackIsEmpty(L)&&GetTop(L)=='['){
                    Pop(&L);
                }else
                {
                    flag=0;
                }
                break;
            case '}':
                if(!StackIsEmpty(L)&&GetTop(L)=='{'){
                    Pop(&L);
                }else
                {
                    flag=0;
                }
                break;
            default:
                break;
          }
          i++;
    }
    if(StackIsEmpty(L)&&flag){
        printf("括号匹配.\n");
        return OK;
    }else
    {
        printf("括号不匹配.\n");
        return ERROR;
    }
    return OK;
}

int main()
{
    char ch[MAX_SIZE]={'0'};
    printf("请输入括号表达式:");
    scanf("%s",ch);
    Matching(ch);
    return 0;
}

运行效果

image-20230410172857646


🚀先看后赞,养成习惯!🚀

🚀 先看后赞,养成习惯!🚀

🎈觉得文章写得不错的老铁们,点赞评论关注走一波!谢谢啦!🎈


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值