基本思想:先封装好一个栈,然后输入我们的括号,比如 ([{}] ,然后让我们的左括号进栈,遇见右括 号,如果栈顶元素是与其相匹配的左括号,则出栈,若不是则说明匹配失败,返回。
代码分析:
stack.h
#define _CRT_SECURE_NO_WARN
typedef char DataType;
typedef struct stack
{
DataType*top;//栈顶
size_t size;//有效元素
size_t capacity;//容量
}Stack;
void IntiStack(Stack*ps, size_t capacity);
void PushStack(Stack*ps, DataType data);//入栈
void PopStack(Stack*ps);//出栈
DataType TopStack(Stack*ps);//栈顶元素
size_t SizeStack(Stack*ps);
stack.c
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<Windows.h>
#include<assert.h>
#include"Stack.h"
void IntiStack(Stack*ps,size_t capacity)
{
assert(ps&&capacity>0);
ps->top = (DataType*)malloc(sizeof(DataType)*capacity);
assert(ps->top);
ps->size = 0;
ps->capacity = capacity;
}
void PushStack(Stack*ps, DataType data)
{
assert(ps);
if(ps->capacity==ps->size)//栈满时,申请两倍内存
{
ps->capacity *= 2;
ps->top = (DataType*)realloc(ps->top, sizeof(DataType)*ps->capacity);
}
ps->top[ps->size++] = data;
}
void PopStack(Stack*ps)
{
assert(ps&&ps->size);
--ps->size;
}
DataType TopStack(Stack*ps)
{
assert(ps&&ps->size);
return ps->top[(ps->size) - 1];
}
size_t SizeStack(Stack*ps)
{
assert(ps);
return (ps->size);
}
test.c
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include"Stack.h"
#include<Windows.h>
#define MAX 50
test()
{
int i = 0;
char str[MAX];
Stack _stack;
IntiStack(&_stack,20);
printf("Please Enter 括号:");
scanf("%s", &str);
//char*p = &str;
while (str[i])
{
switch (str[i])
{
case '(':
PushStack(&_stack, str[i]);
break;
case'[':
PushStack(&_stack, str[i]);
break;
case'{':
PushStack(&_stack, str[i]);
break;
case'}':
if (_stack.size == 0 || TopStack(&_stack) != '{')//栈内没有元素或栈顶元素不匹配
{
printf("右括号多余\n");
return 0;
}
PopStack(&_stack);
break;
case']':
if (_stack.size == 0 || TopStack(&_stack) != '[')
{
printf("右括号多余\n");
return 0;
}
PopStack(&_stack);
break;
case')':
if (_stack.size == 0 || TopStack(&_stack) != '(')
{
printf("右括号多余\n");
return 0;
}
PopStack(&_stack);
break;
default:
break;
}
i++;
}
if (SizeStack(&_stack))//循环结束,栈内还有元素
{
printf("左括号多余\n");
return 0;
}
return 1;
}
int main()
{
if (test())
{
printf("正确\n");
}
else
{
printf("错误\n");
}
system("pause");
return 0;
}