C语言基础例题1-3题-指针篇
C语言基础例题4-5题-二维数组篇
C语言基础例题6-7题-结构体篇
C语言基础例题8-9题-大作业篇
C语言基础例题10-11题-计算数字个数
C语言基础例题12题-链表
C语言基础例题13题-字符串逆序
C语言基础例题14-15题-三阶行列式
编写一个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: 输入 “))(”,预期输出:不匹配
#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;
}
#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;
}