南阳理工oj-2括号配对问题

题目描述:
现在,有一行括号序列,请你检查这行括号是否配对。
输入描述:
第一行输入一个数N(0<N<=100),表示有N组测试数据。后面的N行输入多组输入数据,每组输入数据都是一个字符串S(S的长度小于10000,且S不是空串),测试数据组数少于5组。数据保证S中只含有"[", “]”, “(”, “)” 四种字符
输出描述:
每组输入数据的输出占一行,如果该字符串中所含的括号是配对的,则输出Yes,如果不配对则输出No
样例输入:
复制
3
[(])
(])
([])
样例输出:
No
No
Yes

问题解决的一个关键突破口在于每一个右括号是和它最近的左括号配对的,知道这个原理,我们就有思路了。我们这里利用栈来解决这个问题,遇到左括号进栈,遇到右括号和栈顶元素进行比较,如果相同则栈顶元素出栈,如果最后栈为空则配对,否则不配对。记得右括号的ASCII码要比左括号大1或者大2,字符串和栈的空间也记得开大一点,不然OJ过不了。

#include<iostream>
using namespace std;
#define MAXSIZE  10000
 #define OVERFLOW -2
typedef struct stack
{
	char *top;
	char *base;
	int stacksize;
}Stack;

bool init(Stack &S);
bool push(Stack &S,char c);
bool isempty(Stack &S);
bool gettop(Stack &S,char &c);
bool pop(Stack &S);
bool match(char a,char b);
int judege2(char data[]);


int main()
{	
	
	int n;
	cin>>n;
	int x=n;
	char data[10000];
	while(n--)
	{
		cin>>data;
		judege2(data);	
	}
	return 0;
}
bool init(Stack &S)
{
	S.base = new char[MAXSIZE];
	if(!S.base)
	exit(OVERFLOW );
	S.top=S.base;
	S.stacksize=MAXSIZE;
	return true;
}
bool push(Stack &S,char c)
{
	if(S.top-S.base==S.stacksize)
		return false;
	*S.top++=c;
	return true;
}
bool isempty(Stack &S)
{
	if(S.top==S.base)
		return true;
	else
		return false;
}

bool pop(Stack &S,char &x)
{
	if(S.base==S.top)
		return false;
			x=*--S.top;
			return true;		
}


bool gettop(Stack &S,char &c)
{
		if(isempty(S))
	{
		return false;
	}

		else
		{	c=*(S.top-1);
			return true;	
		}

}

bool match(char a,char b)
{
	if(a+1==b||a+2==b)
		return true;
	else
		return false;
}

int judege2(char data[])
{
	Stack S;
	char z;
	init(S);
	for(int i=0;data[i]!='\0';i++)
	{
		switch(data[i])
		{
			case'(':
			case'[':
				push(S,data[i]);
				break;
			case')':
			case']':
				if(isempty(S))
					{
						cout<<"No"<<endl;
						return 0;
					}
				else
					{
						gettop(S,z);
						if(match(z,data[i]))
							pop(S,z);
						else
						{
							cout<<"No"<<endl;
							return 0;
						}
						
					}
		}
	
	}
	
	if(isempty(S))
		cout<<"Yes"<<endl;
	else
		cout<<"No"<<endl;


		return 0;
	
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值