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

文章目录

  • 1-15题
  • 题目 16
  • 题目 16 参考答案 1
  • 题目 16 参考答案 2

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 
#include 
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 
#include 
#include

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;
}

你可能感兴趣的:(练习题,c语言,开发语言,学习,青少年编程,算法)