3.2 Use la pila para determinar el vector de caracteres palíndromo

Tema: Un palíndromo se refiere a una secuencia de caracteres que es la misma tanto por delante como por detrás. Por ejemplo, "abba" y "abdba" son ambos palíndromos, pero "bueno" no es un palíndromo. Intente escribir un algoritmo para determinar si un vector de caracteres dado es un palíndromo.

Idea de algoritmo:
De acuerdo con los ejemplos del título, es necesario clasificar y discutir según el número de caracteres en el vector de caracteres.
1. Cuando la longitud del vector de caracteres es un número par , el número de caracteres insertados en la pila es exactamente la mitad del vector de caracteres; cuando la pila no está vacía, los elementos superiores de la pila se extraen secuencialmente y se comparan con los elementos de la segunda mitad del vector de caracteres. El elemento superior es diferente del vector de caracteres actual, lo que indica que no es un vector de caracteres palíndromos, y se devuelve FALSE; de lo contrario, el nuevo elemento superior de la pila se compara con el siguiente carácter hasta que la pila esté vacía, lo que indica que es un vector palíndromo.
2. Cuando la longitud del vector de caracteres es impar , los caracteres del medio deben omitirse; los caracteres antes del carácter del medio se colocan en la pila y los elementos de la pila se comparan con los caracteres después del carácter del medio en giro.

Descripción del algoritmo:

int IsHuiwen(SqStack &S,char str[]){
	int length=strlen(str); //length表示字符向量的长度
	int m=length/2;   //m表示字符向量长度的一半,用m将字符向量分成两部分
	char top;     //定义一个字符型变量top,用来表示栈顶元素的值
	for(i=0;i<m;i++){
		Push(S,str[i])  //调用Push函数将前一半字符插入栈S
		}
	if(length%2==0){    //当字符向量的长度为偶数时
		while(!IsEmpty(S)){  //若栈不为空,执行此循环
			Pop(S,top);       //调用出栈函数,栈顶元素出栈,并将栈顶元素赋值给变量top
			if(top!=str[i]){  //栈顶元素和对应的字符不同
				return 0;  //退出循环,不是回文字符向量
			}else{       //栈顶元素和对应的字符相同, 取后一个字符,继续执行此循环
				i++; 
			}
		}
	}else{         //当字符向量的长度为奇数时
		i=i+1;      //跳过中间字符
		while(!IsEmpty(S)){     //同上
			Pop(S,top);
			if(top!=str[i]){
				return 0;
			}else{
				i++;
			}
		}
	}
	return 1;      //循环执行结束,直到栈空,说明是回文字符向量
}

Supongo que te gusta

Origin blog.csdn.net/qq_39688282/article/details/108062473
Recomendado
Clasificación