C语言判断输入的字符串中括号是否成对匹配

文章讲述了如何使用C语言和栈数据结构实现一个函数,检查给定的括号字符串是否有效,确保每个(都有相应的)且顺序正确。通过遍历字符串并操作栈来判断括号匹配情况。
摘要由CSDN通过智能技术生成

1-15题

C语言基础例题1-3题-指针篇
C语言基础例题4-5题-二维数组篇
C语言基础例题6-7题-结构体篇
C语言基础例题8-9题-大作业篇
C语言基础例题10-11题-计算数字个数
C语言基础例题12题-链表
C语言基础例题13题-字符串逆序
C语言基础例题14-15题-三阶行列式

题目 16

编写一个C程序,实现括号匹配检查的功能。给定一个只包含圆括号(‘(’ 和 ‘)’)的字符串,使用栈结构判断这个字符串中的括号是否有效,即每一个 ‘(’ 都有与之对应的 ‘)’,并且括号的顺序是正确的。

下面是 Stack 结构体的定义,用于存储整数类型的数据,模拟栈结构:

typedef struct {
    int capacity;
    int *data;
    int top;
} Stack;

int capacity: 这个成员变量表示栈的容量。

int *data: 用于实际存储栈中的元素。

int top: 栈顶指针(或称为栈顶索引)。

实现以下函数:

初始化栈:void initStack(Stack *s, int size);
入栈操作:bool push(Stack *s, int item); 这里入栈元素为 1 表示遇到左括号 ‘(’。
出栈操作:int pop(Stack *s); 出栈时不关心具体值,仅确认是否能成功出栈。
判断栈是否为空:bool isEmpty(Stack *s);

bool isBalancedParentheses(char *expr);

输入参数:一个以’\0’结尾的字符数组 expr,表示待检查的括号字符串。

该函数逻辑:
遍历输入的字符串,当遇到左括号时入栈。
当遇到右括号时,检查栈是否为空;若非空,则弹出栈顶元素(假设它是左括号),否则说明不匹配。
遍历结束后,如果栈为空,则说明所有括号都正确匹配,返回true;如果有剩余的左括号未被匹配,则返回false。

测试用例
test_case_1: 输入 “()”,预期输出:匹配
test_case_2: 输入 “(())”,预期输出:匹配
test_case_3: 输入 “(()())”,预期输出:匹配
test_case_4: 输入 “((()))”,预期输出:匹配
test_case_5: 输入 “)(”,预期输出:不匹配
test_case_6: 输入 “()(”,预期输出:不匹配
test_case_7: 输入 “(()”,预期输出:不匹配
test_case_8: 输入 “))(”,预期输出:不匹配

题目 16 参考答案 1

#include <stdio.h>
#include <stdlib.h>
typedef struct
{
    int capacity;
    int *data;
    int top;
} Stack;
void initStack(Stack *s, int size);
int push(Stack *s,int item);
int pop(Stack *s);
int isEmpty(Stack *s);
int isBalancedParentheses(char *expr);
int main(void)
{
    if (isBalancedParentheses("()(])"))
        printf("匹配");
    else
        printf("不匹配");
    getchar();
    getchar();
    return 0;
}
void initStack(Stack *s, int size)
{
    s->data = (int *)malloc(sizeof(int) * size);
    s->capacity = size;
    s->top = -1;
}
int push(Stack *s,int item)
{
    if (s->top + 1 == s->capacity)
        return 0;
    s->data[++s->top] = item;
    return 1;
}
int pop(Stack *s)
{
    if (isEmpty(s))
        return 0;
    s->top--;
}
int isEmpty(Stack *s)
{
    if (s->top == -1)
        return 1;
    return 0;
}
int isBalancedParentheses(char *expr)
{
    Stack s;
    initStack(&s, 5);
    while (*expr != '\0')
    {
        if (*expr == '(')
            push(&s,1);
        else if (*expr == ')')
            pop(&s);
        expr++;
    }
    if (isEmpty(&s))
        return 1;
    return 0;
}

题目 16 参考答案 2

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

typedef struct
{
    int capacity;
    int *data;
    int top;
} Stack;

void initStack(Stack *s, int size)
{
    s->capacity = size;
    s->data = (int *)malloc(s->capacity * sizeof(int));
    if (!s->data)
    {
        printf("内存申请失败.\n");
        exit(EXIT_FAILURE);
    }
    s->top = -1;
}

int push(Stack *s, int item)
{
    if (s->top >= (s->capacity - 1))
    {
        printf("栈溢出.\n");
        return 0;
    }
    s->top++;
    s->data[s->top] = item;
    return 1;
}

int pop(Stack *s)
{
    if (s->top < 0)
    {
        printf("栈下溢. 不能从空栈中出栈.\n");
        return 0;
    }
    s->top--;
    return 1;
}

int isEmpty(Stack *s)
{
    return s->top == -1;
}

int isBalancedParentheses(char *expr)
{
    Stack s;
    initStack(&s, strlen(expr));

    for (int i = 0; expr[i] != '\0'; ++i)
    {
        if (expr[i] == '(')
        {
            push(&s, 1);
        }
        else if (expr[i] == ')')
        {
            if (isEmpty(&s))
            {
                return 0;
            }
            pop(&s);
        }
    }

    return isEmpty(&s);
}

int main()
{
    char expr1[] = "()(])";
    if (isBalancedParentheses(expr1))
    {
        printf("表达式: %s\n", expr1);
        printf("匹配.\n");
    }
    else
    {
        printf("不匹配.\n");
    }
    getchar();
    getchar();
    return 0;
}
  • 10
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

水智

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值