小白学ACM-括号配对问题(栈实现)

本文介绍了ACM编程竞赛中常见的括号配对问题,通过栈这一数据结构来实现有效检查括号的正确配对。详细讲解了如何利用栈的特性解决此类问题。
摘要由CSDN通过智能技术生成

括号配对问题

时间限制: 3000 ms  |  内存限制: 65535 KB
难度: 3
描述
现在,有一行括号序列,请你检查这行括号是否配对。
输入
第一行输入一个数N(0<N<=100),表示有N组测试数据。后面的N行输入多组输入数据,每组输入数据都是一个字符串S(S的长度小于10000,且S不是空串),测试数据组数少于5组。数据保证S中只含有"[","]","(",")"四种字符
输出
每组输入数据的输出占一行,如果该字符串中所含的括号是配对的,则输出Yes,如果不配对则输出No
样例输入
3
[(])
(])
([[]()])
样例输出
No
No
Yes
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#define gao  10020
typedef struct zz
{
	int top;
	char ch[gao];
}xiaozeng;
void chushihua(xiaozeng* p)//初始化栈
{
	p->top = -1;//
}
int isempty(xiaozeng* p)//判断是否为空
{
	if (-1 == p->top)
	{
		return 1;
	}
	return 0;
}
int isman(xiaozeng *p)//判断栈是否满了
{
	if (p->top == gao - 1)
	{
		return 1;
	}
	return 0;
}
int  push(xiaozeng * p, char n)//入栈
{
	if (p->top == gao - 1)
	{
		return 0;
	}
	p->top++;
	p->ch[p->top] = n;
	return 1;
}
int pop(xiaozeng *p, char *num)//出栈
{
	//双击查看原图ar num;
	if (p->top == -1)
	{
		return 0;
	}
	*num = p->ch[p->top];
	p->top--;
	return 1;
}
int  budong(xiaozeng *p, char *num)//出栈不过,栈顶不动
{


	if (p->top == -1)
	{
		return 0;
	}
	*num = p->ch[p->top];


	return 1;
}
int peidui(char a, char b)
{
	if (a == '('&&b == ')')
	{
		return 1;
	}
	if (a == '['&&b == ']')
	{
		return 1;
	}
	else
		return 0;

}
void zhupeidui(char *str)
{
	xiaozeng s;
	int i;
	char ch;
	chushihua(&s);
	for (i = 0; str[i] != '\0'; i++)/*对字符串中的字符逐一扫描*/
	{
		switch (str[i])
		{
		case '[':
		case '(':
			push(&s, str[i]);//如果是左括号就入栈
			break;
		case ']':
		case ')':
			if (isempty(&s))//如果右括号配对时,栈为空就是不对的
			{
				printf("No\n");
				return;

			}
			else
			{
				budong(&s, &ch);//不动,拿出栈顶元素
				if (peidui(ch, str[i]))
					pop(&s, &ch);//已配对的左括号出栈   //
				//下面是我加的,如果不匹配就可以判定NO    //我感觉不加也对吧,如果不匹配就不会弹出左括号,那么栈就不为空,那么就No
				else {
					printf("No\n");
					return;
				}

			}

		}
	}
	if (isempty(&s))//最后栈如果为空就输出Yes
	{
		printf("Yes\n");
	}
	else   //栈不为空就输出No
	{
		printf("No\n");
	}
}
int main()
{
	int num;
	scanf("%d", &num);//
	while (num--)
	{
		char str[gao];
		scanf("%s", str);
		zhupeidui(str);
	}
	//system("pause");
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值