C语言链式栈匹配括号

1、首先为了实现括号匹配,我运用了逻辑结构为栈,储存结构为链式存储两种组合来进行操作实现。一般常见的括号有以下几种:“(”、“)”、“[”、“]”、“{”、“}”、“<”、“>”四大类。什么情况为匹配什么情况不匹配呢?

比如:{[123]}是匹配的 、([1])[4]是匹配的 、((r]是不匹配的 、([y)]是不匹配的等等。

程序中如果是匹配的,则输出匹配成功,如果不匹配则输出匹配失败

栈的工作原理:作为一种数据结构 ,是一种只能在一端进行插入和删除操作的特殊 线性表 。它按照后进先出(先进后出)的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来)。

2、程序如下:

//用到的头文件
#include <stdio.h>
#include <stdlib.h>
//定义一个结构体,用来存储一个数据元素的内容和指向下一个数据元素的地址
struct match
{
        char bracket;
        struct match *next;
};

//定义一个申请空间的函数,申请空间为一个结构体大小,用来表示头节点,并通过函数返回申请空间的首地址
struct match *creat_list()
{
        struct match *head = malloc(sizeof(struct match));

        if (head == NULL)
        {
                printf("creat fail\n");//如果申请失败则打印
        }

        head->next = NULL;//将头节点指向下一个元素的指针赋值为NULL

        return head;
}

//实现在链表中插入元素
void insert_list(struct match *head,char bracket)
{
        struct match *p = head;

        struct match *new = malloc(sizeof(struct match));

        if (new == NULL)
        {
                return ;
        }

        new->next = p->next;//将新创建的元素中的存储地址的内容指向上一个元素
        p->next = new;//将新元素的地址给头指针

        new->bracket = bracket;
}
//判断链表的元素是否为空,如果为空就不能删掉链表的元素
int empty(struct match *head)
{
        if (head->next == NULL)
        {
                printf("is empty\n");
                return 1;
        }
        return 0;
}

//删除链表里元素的函数,删掉的是后进栈的元素
void del_list(struct match *head)
{
        struct match *p = head;

        if (empty(p))
        {
                return ;
        }
        struct match *del = p->next;

        p->next = del->next;

        free(del);//删除过后要释放掉刚刚申请的内存空间
}
//此函数就是实现判断输入的括号是否匹配。原理就是先将输入的左括号一个一个的压栈(入栈),然后遇到了右括号就去跟栈顶上的元素匹配,如果匹配成功,则接着匹配,直到把栈里面的元素匹配完,当匹配一个括号的时候,栈就要出栈一个元素
int bra_match(struct match *head,char *buff)  //{[<>]}
{
        struct match *p = head;
        for (int i = 0; *(buff+i) != '\0'; i++)
        {
                switch(*(buff+i))
                {
                        case '{':
                                        insert_list(p,'{');
                                        break;
                        case '[':
                                        insert_list(p,'[');
                                        break;
                        case '<':
                                        insert_list(p,'<');
                                        break;
                        case '(':
                                        insert_list(p,'(');
                                        break;

                        case '}':
                                        if('}'-2 == p->next->bracket)
                                        {
                                                del_list(p);
                                                if (p->next == NULL)
                                                {
                                                        return 1;
                                                }
                                        }
                                        break;

                        case ']':
                                        if(']'-2 == p->next->bracket)
                                        {
                                                del_list(p);
                                                if (p->next == NULL)
                                                {
                                                        return 1;
                                                }
                                        }
                                        break;


                        case '>':
                                        if('>'-2 == p->next->bracket)
                                        {
                                                del_list(p);

                                                if (p->next == NULL)
                                                {
                                                        return 1;
                                                }
                                        }
                                        break;
                        case ')':
                                        if(')'-1 == p->next->bracket)
                                        {
                                                del_list(p);

                                                if (p->next == NULL)
                                                {
                                                        return 1;
                                                }
                                        }
                                        break;
                        default :
                                        break;
                }

        }
}

//主函数,主要是实现调用功能函数,并打印相应的结果
int main(int argc, char const *argv[])
{
        char buff[20];
        int x;

        scanf("%s",buff);

        struct match *p = creat_list();

        x = bra_match(p,buff);
        if (x == 1)
        {
                printf("匹配成功\n");
        }
        else
        {
                printf("匹配失败\n");
        }

        return 0;
}

3、运行代码结果如下

 4、总结

这是学数据结构的时候做的一道题,可能用到的C语言不是很难,但是要想做出来,必须要先理解栈的工作原理。学习的路途还很遥远,要坚持的学下去。陌生人,一起努力吧!

  • 2
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
好的,以下是 C 语言顺序实现括号匹配的代码示例: ```c #include <stdio.h> #include <stdlib.h> #include <stdbool.h> #define MAXSIZE 100 // 的最大长度 typedef struct { char data[MAXSIZE]; int top; // 顶指针 } Stack; // 初始化 void InitStack(Stack *S) { S->top = -1; } // 判断是否为空 bool IsEmpty(Stack *S) { return S->top == -1; } // 判断是否已满 bool IsFull(Stack *S) { return S->top == MAXSIZE - 1; } // 入 bool Push(Stack *S, char c) { if (IsFull(S)) { return false; } S->data[++S->top] = c; return true; } // 出 bool Pop(Stack *S, char *c) { if (IsEmpty(S)) { return false; } *c = S->data[S->top--]; return true; } // 获取顶元素 bool GetTop(Stack *S, char *c) { if (IsEmpty(S)) { return false; } *c = S->data[S->top]; return true; } // 判断是否为左括号 bool IsLeft(char c) { return c == '(' || c == '[' || c == '{'; } // 判断是否为右括号 bool IsRight(char c) { return c == ')' || c == ']' || c == '}'; } // 判断左右括号是否匹配 bool IsMatch(char left, char right) { return (left == '(' && right == ')') || (left == '[' && right == ']') || (left == '{' && right == '}'); } // 判断括号序列是否匹配 bool IsParenthesesMatch(char *str) { Stack S; InitStack(&S); for (int i = 0; str[i] != '\0'; i++) { if (IsLeft(str[i])) { // 左括号 Push(&S, str[i]); } else if (IsRight(str[i])) { // 右括号顶元素匹配则出 char top; if (!Pop(&S, &top) || !IsMatch(top, str[i])) { return false; } } } // 括号序列匹配当且仅当为空 return IsEmpty(&S); } int main() { char str[MAXSIZE]; printf("请输入括号序列:"); scanf("%s", str); if (IsParenthesesMatch(str)) { printf("括号序列匹配\n"); } else { printf("括号序列不匹配\n"); } return 0; } ``` 代码的思路是:遍历括号序列,若是左括号则入,若是右括号则与顶元素匹配,若匹配则将顶元素出,否则返回不匹配。最后判断是否为空,若为空则括号序列匹配,否则不匹配

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值