提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
一、问题描述
描述:
假设表达式允许包含3种括号:圆括号、方括号和大括号,其嵌套的顺序随意,如{([])}或{[([][])]}是正确的匹配,{[(])或{(或(()))均为错误的匹配。设计一个算法采用顺序栈判断表达式中的括号是否正确配对。
输入:
输入仅包含圆括号、方括号和大括号的一行字符,英文格式下输入,自以’(’ ‘[’ ‘{‘之一开头,以’)’‘]’'}'之一结尾
输出:
输入字符串中括号匹配输出“YES”,不匹配“NO”
样例:
二、代码实现
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
#include<assert.h>
typedef char DataType;
typedef struct stack
{
DataType* arr;
int capacity;
int top;
}ST;
//初始化栈
void StackInit(ST* st)
{
assert(st);
st->arr = NULL;
st->capacity = 0;
st->top = 0;
}
//入栈
void StackPush(ST* st, DataType x)
{
assert(st);
if (st->capacity == st->top)
{
int newcapacity = st->capacity == 0 ? 4 : st->capacity*2;
DataType* tem = (DataType*)realloc(st->arr, sizeof(DataType) * newcapacity);
if (tem == NULL)
{
perror("realloc fail");
return;
}
st->arr = tem;
st->capacity = newcapacity;
}
st->arr[(st->top)++] = x;
}
//出栈
void StackPop(ST* st)
{
assert(st);
st->top--;
}
//取栈顶元素
DataType StackTop(ST* st)
{
assert(st);
return st->arr[st->top - 1];
}
//判断栈为空
bool IsEmpty(ST* st)
{
assert(st);
return st->top == 0;
}
int main()
{
//接收字符串
char arr[100];
scanf("%s", arr);
//创建栈
ST stack;
StackInit(&stack);
int i = 0;
while (arr[i] != '\0')
{
if (arr[i] == '[' || arr[i] == '{' || arr[i] == '(')
{
StackPush(&stack, arr[i]);
i++;
}
else
{
if (!IsEmpty(&stack))
{
if ((arr[i] == ']' && StackTop(&stack) == '[')
|| (arr[i] == '}' && StackTop(&stack) == '{')
|| (arr[i] == ')' && StackTop(&stack) == '('))
{
StackPop(&stack);
i++;
}
else
{
break;
}
}
else
{
break;
}
}
}
if (arr[i] != '\0')
{
printf("NO");
}
else
{
if (IsEmpty(&stack))
{
printf("YES");
}
else
{
printf("NO");
}
}
return 0;
}