Implementación del lenguaje C de coincidencia de corchetes

Coincidencia de soporte

     Dada una cadena que solo incluye '(', ')', '{', '}', '[', ']', determine si la cadena es válida
[la cadena válida debe cumplirse]
     1. El paréntesis izquierdo debe ser utilizado Se cierra el mismo tipo de paréntesis de cierre.
     2. El paréntesis de la izquierda debe cerrarse en el orden correcto.
     3. Tenga en cuenta que una cadena vacía se puede considerar una cadena válida.
[Análisis de la pregunta]:
    sabemos que cualquier tipo de paréntesis aparece en pares. Por lo tanto, si el paréntesis izquierdo vuelve a aparecer, debe haber un paréntesis derecho coincidente, pero si solo se cumple esta condición, no se puede realizar normalmente. Coincidencia, porque no es suficiente hacer que el número de ocurrencias sea el mismo, y también es necesario dejar que se combinen en el orden correcto. Por lo tanto, usamos la estructura de la pila, usamos su característica de primero en entrar, último en salir para empujar el paréntesis izquierdo hacia adentro, comparar el precio del paréntesis derecho con el elemento superior de la pila y sacarlo de la pila. Finalmente, cuando la pila está vacía, el recorrido finaliza al mismo tiempo, lo que indica una coincidencia. El código específico es el siguiente:
primero simplemente construya una pila

typedef char STDataType;
typedef struct stack
{
    
    
	STDataType* _data;
	int _size;
	int _capacity;//栈的容量
}stack;
void initStack(stack* st)//初始化栈
{
    
    
	if (st == NULL)
		return;
	st->_data = NULL;
	st->_capacity = st->_size = 0;
}
void checkCapacity(stack* st)//容量检查
{
    
    
	if (st->_capacity == st->_size)
	{
    
    
		
		int newCap = st->_capacity == 0 ? 1 : 2 * st->_capacity;
		st->_data = (STDataType*)realloc(st->_data, sizeof(STDataType)*newCap);
		
		st->_capacity = newCap;
	}
}
void stackpush(stack* st, STDataType val)//压栈
{
    
    
	if (st == NULL)
		return;
	checkCapacity(st);
	st->_data[st->_size++] = val;
}
void stackpop(stack* st)//出栈
{
    
    
	if (st == NULL || st->_size == 0)
		return;
	--st->_size;

}
STDataType stackTop(stack* st)//取栈顶元素
{
    
    
	if (st == NULL || st->_size == 0)
		return 0;
	return  st->_data[(st->_size) - 1];
}
int stackEmpty(stack* st)//判空
{
    
    
	if (st == NULL || st->_size == 0)
		return 1;
	else
		return 0;
}

Sobre esta base, juzgue la subrutina:

//判断函数
bool isRight(char* s)
{
    
    
	//括号映射
	char map[3][2] = {
    
     {
    
     '(', ')' }, {
    
     '{', '}' }, {
    
     '[', ']' } };
	struct stack st;
	initStack(&st);
	while (*s)
	{
    
    
		int flag = 0;
		for (int i = 0; i < 3; ++i)//判断是否为左括号
		{
    
    
			if (*s == map[i][0])
			{
    
    
				stackpush(&st, *s);
				//判断下一个字符
				++s;
				flag = 1;
				break;
			}
		}
		if (flag == 0)
		{
    
    
			//取出栈顶元素,先判断栈是否为空
			if (stackEmpty(&st))
				return false;
			char topchar = stackTop(&st);
			stackpop(&st);
			for (int i = 0; i < 3; ++i)//判断与哪一个匹配
			{
    
    
				if (map[i][1] == *s)
				{
    
    
					if (map[i][0] == topchar)
					{
    
    
						//判断下一个字符
						++s;
						break;
					}
					else
						return false;//没有正确匹配
				}
			}
		}

	}
	//判断栈是否为空
	return stackEmpty(&st);
}

Supongo que te gusta

Origin blog.csdn.net/dream_i_success/article/details/111706239
Recomendado
Clasificación