栈的括号应用(顺序栈)

其核心算法就是输入一串字符串包括:[],{},(),进行括号匹配,所要用到的函数有初始化栈,判空,出入栈。


结构体的定义

//结构体的定义
typedef struct 
{
	char data[maxsize];//括号
	int top;//记录当前长度
}SqStack;

括号匹配函数

int Check(SqStack& S, char str[],int length) 
{
	char e;
	if (length == 0)return 0;
	for (int i = 0; i < length; i++) 
	{
		//如果栈空并且当前字符为右括号结束
		if ((str[i] == ')' || str[i] == ']' || str[i] == '}')&&S.top==-1)return 0;
		if ((str[i] == '(' || str[i] == '[' || str[i] == '{')&& S.top != maxsize - 1)
		{
			Push(S, str[i]); 
		}
		if ((str[i] == ')' || str[i] == ']' || str[i] == '}') && S.top != -1)//当此时为右括号时判断栈是否空
		{
			Pop(S, e);
			if (e == '(' && str[i] != ')')return 0;
			if (e == '[' && str[i] != ']')return 0;
			if (e == '{' && str[i] != '}')return 0;
		}//说明其中有括号匹配失败
	
	}
	return IsEmpty(S);
}

首先定义一个字符数组,输入一串字符串,定义一个栈用来保存临时的字符,再将表长传入Cheak,首先判断若表长为零则无数据做对比,退出函数,若有则循环遍历数组,首先看是否是右括号及栈是否空若如此直接退出,否则将左括号压入栈中,然后继续遍历,再遇见左括号,则继续压入,若遇见右括号,则判断栈是否空若空直接退出,否则弹出栈顶的左括号,若匹配列入(){}这样则匹配成功,否则匹配不成功直接退出。下列是流程图

逻辑流程图

全部代码

#include<stdio.h>
#include<stdlib.h>
#define maxsize 5
#define initsize 10
#pragma warning(disable:4996)
#pragma warning(disable:5208)
#pragma warning(disable:6031)
//结构体的定义
typedef struct 
{
	char data[maxsize];//括号
	int top;//记录当前长度
}SqStack;

//初始化栈
int InitStack(SqStack& S) 
{
	int i;
	for (i = 0; i < maxsize; i++) 
	{
		S.data[i] = 0;
	}
	S.top = -1;//top指针指向当前的前一个位置
	return 1;
}

//栈判空
int IsEmpty(SqStack S) 
{
	if (S.top == -1)return 1;
	return 0;
}

//入栈
int  Push(SqStack& S,char e) 
{
	if (S.top == maxsize - 1)return 0;//栈满
	S.data[++S.top] = e;
	return 1;
}

//出栈
int Pop(SqStack& S, char& e) 
{
	if (S.top == -1)return 0;//栈空
	e = S.data[S.top--];
	return 1;
}

//匹配
int Check(SqStack& S, char str[],int length) 
{
	char e;
	if (length == 0)return 0;
	for (int i = 0; i < length; i++) 
	{
		//如果栈空并且当前字符为右括号结束
		if ((str[i] == ')' || str[i] == ']' || str[i] == '}')&&S.top==-1)return 0;
		if ((str[i] == '(' || str[i] == '[' || str[i] == '{')&& S.top != maxsize - 1)
		{
			Push(S, str[i]); 
		}
		if ((str[i] == ')' || str[i] == ']' || str[i] == '}') && S.top != -1)//当此时为右括号时判断栈是否空
		{
			Pop(S, e);
			if (e == '(' && str[i] != ')')return 0;
			if (e == '[' && str[i] != ']')return 0;
			if (e == '{' && str[i] != '}')return 0;
		}//说明其中有括号匹配失败
	
	}
	return IsEmpty(S);
}


int main()
{
	int i = 0, length = 0,c=0;
	char str[maxsize] = { 0 };
	char e;
	SqStack S;
	printf("初始化:%d\n", InitStack(S));
	printf("请输入'(',')','[',']','{','}':");
	/*for(i=0;i<maxsize;i++)
	{
		scanf("%c/", &e);
		str[i] = e;
		length++;
	}*/
	scanf("%s", str);
	c = Check(S,str,maxsize);
	printf("\n匹配结果是:%d", c);
	return 1;
}

经测试,实现基本功能,望指点。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值