检查括号是否匹配问题

借助于栈实现:

方法(1):依次读取每个字符,如果是左括号就入栈,如果是右括号,看栈顶是否是对应的左括号,是的话弹出栈顶元素,代表一对括号匹配完毕,再判断下一个字符。不是的话,说明匹配失败。最后记得要判断栈为空才匹配成功,防止左括号个数与右括号个数不一致。
方法(2):与方法1思想一致,只是方法二的扩展性较好,假如增加其它的括号(如<、>)等。

方法一代码:(如果是C语言中,前提是你已经实现好了栈数据结构Stack)

int IsValid(char* str)//匹配返回1,否则返回0
{
	assert(str);
	Stack s;
	StackInit(&s, 10);

	while (*str)
	{
		if ((*str == '(') || (*str == '[') || (*str == '{'))//当遇到的字符是"左括号",就入栈
		{
			StackPush(&s,*str);
		}
		else//不是左括号(那就看是哪一种右括号,或者哪一种右括号也不是)
		{
			char top = StackTop(&s);
			if (*str == ')')//右括号')'
			{
				if (top == '(')
				{
					return 1;
				}
				else
				{
					return 0;
				}
			}
			else if (*str == ']')//右括号']'
			{
				if (top == '[')
				{
					return 1;
				}
				else
				{
					return 0;
				}
			}
			else if (*str == '}')//右括号'}'
			{
				if (top == '{')
				{
					return 1;
				}
				else
				{
					return 0;
				}
			}
			else//不是这三种右括号,直接返回不匹配
			{
				return 0;
			}
		}
		str++;//看下一个字符
	}
	//一个一个字符判断完之后,看栈是不是为空
	if (StackEmpty(&s) == 0)
	{
		return 1;
	}
	else
	{
		return 0;
	}
}

方法二代码:

int IsValid(char* str)//匹配返回1,否则返回0
{
	assert(str);
	Stack s;
	StackInit(&s, 10);

	char symbol[][2] = {
		{'(', ')'},
		{'[', ']'},
		{'{', '}'}
	};

	while (*str)
	{
		int i = 0;
		for (i = 0; i < sizeof(symbol) / sizeof(symbol[0]); i++)
		{
			if (*str == symbol[i][0])//只要这个字符是左括号,入栈,直接判断下一个字符
			{
				StackPush(&s, *str);
				str++;
				break;
			}
		}
		//来到这有两种可能,break跳出来说明*str是左括号,那就直接判断下一个字符,即不执行下面代码。如果是for循环跳出来的,说明*str不是左括号,则要进行以下的代码
		if (i == sizeof(symbol) / sizeof(symbol[0]))
		{
			char top = StackTop(&s);
			for (int i = 0; i < sizeof(symbol) / sizeof(symbol[0]); i++)
			{
				if (*str == symbol[i][1])//只要这个字符是右括号,将栈顶元素与这个右括号对应的左括号比较
				{
					if (top == symbol[i][0])
					{
						StackPop(&s);//出栈
						str++;//看下一个字符
						break;
					}
					else
					{
						return 0;
					}
				}
			}
		}
	}
	if (StackEmpty(&s) == 0)
	{
		return 1;
	}
	else
	{
		return 0;
	}
}
 
 
 

你可能感兴趣的:(数据结构)