用栈实现括号匹配问题

基本思想:先封装好一个栈,然后输入我们的括号,比如  ([{}] ,然后让我们的左括号进栈,遇见右括             号,如果栈顶元素是与其相匹配的左括号,则出栈,若不是则说明匹配失败,返回。

代码分析:

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



 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值