El uso de un palíndromo pila
-
09-10-2019 - |
Pregunta
Nuestro profesor nos requiere para comprobar si una palabra es un palíndromo mediante el uso de pilas.
Cada vez que lo dirige, hay un error: Unhandled Exception. Access violation
¿Qué estoy haciendo mal? ¿Cómo puedo mejorar mi código? Mi código es el siguiente:
typedef struct stack{
char name;
struct stack * next;
}Stack;
void push(Stack**head, char value);
char pop(Stack**head);
int main(){
char word[11];
int i=0;
int lenght = 0;
Stack*head = NULL;
printf("Please type the word: ");
scanf("%s", word);
lenght = strlen(word);
while(word[i]!='\0'){
push(&head, word[i]);
i++;
}
i = 0;
while(pop(&head)==word[i]){
i++;
}
if(i==lenght) printf("The word is a palindrome");
else printf("The word is not a palindrome");
}
Solución
Su función push
debe tener
- la dirección de la cabeza de la pila (usted tiene que corregir) y
- el carácter que necesita ser pulsado (que necesita esta fijación).
Así que la firma del método se convierte en:
void push(Stack**head, char value);
y en el cuerpo de la función se agrega value
a la parte superior de la pantalla como:
temp->name = value;
También debe comprobar siempre el valor de retorno de malloc
.
Dado que va a devolver el valor del hecho estallar pop
función de su tipo de retorno no debe ser void
, cambiarlo a char
tanto en la declaración y la definición como:
char pop(Stack**head)
Hay otro error lógico:
Para empezar se empuja todos los caracteres de la entrada en la pila. A continuación, empezar a aparecer los personajes. No existe una condición de terminación para su estallido. Cuando haya hecho estallar todos los personajes (por lo que su pila está vacía) la siguiente llamada a pop
dará lugar a un accidente debido a que estarán eliminación de referencias a un puntero NULL
(*head
será NULL
).
Para solucionar este problema que el pop sólo los caracteres que haya empujado por hacer:
while(i<lenght && pop(&head)==word[i]){
Desde el &&
está cortocircuitada, pop
no será anunciado una vez que haya hecho estallar todos los personajes.
Como alternativa (y enfoque preferido) es escribir otra función llamada de retorno, que isEmpty
true
/ 1
cuando la pila está vacía y el uso de este método antes de llamar al método pop
.
Otros consejos
usted debe comprobar rico al final de la pila o no en el código:
while(i < length && pop(&head)==word[i]){
i++;
}
Creo que debería cambiar 'pop vacío (Pila ** cabeza) {' en
char pop(Stack **head) {
y también proteger contra pila vacía:
char pop(Stack**head){
Stack* temp;
char val;
temp = *head;
if (!temp) return 0;
val = temp->name;
*head = (*head)->next;
free(temp);
return val;
}
También podría considerar el uso de "recursividad", que es de alguna manera similar a la construcción de una pila, sólo que se realiza para sus llamadas a métodos implícitamente.
El problema palíndromo es un ejercicio clásico para aprender el poder de recursividad:)
Esta es la función que se está llamando que:
push(&head, i, word[i]);
Esta es la función como declara y define:
void push(Stack**head, int i, char value[i]);
Así arg 3 en la declaración es una matriz de caracteres, mientras que arg 3 en la parte llamante es un personaje. Cambiar su push()
utilizar un carácter de value
y i
simplemente omitir:
void push(Stack**head, char value){
Stack *temp = (Stack*)malloc(sizeof(Stack));
temp->name = value;
temp->next = *head;
*head = temp;
}
Ahora lo llaman con:
push(&head, word[i]);
su código tiene un problema en la parte while-pop
.
Para su conveniencia, he adjuntado el código de trabajo modificado para usted:
typedef struct stack{
char name;
struct stack * next;
}Stack;
void push(Stack**head, char value);
char pop(Stack**head);
int main (int argc, const char * argv[]) {
char word[11];
int i=0;
int lenght = 0;
Stack*head = NULL;
printf("Please type the word: ");
scanf("%s", word);
lenght = strlen(word);
while(word[i]!='\0'){
push(&head, word[i]);
i++;
}
//i = 0;
//while(pop(&head)==word[i]){
// i++;
//}
int counter=0;
i=0;
for (counter=0; counter<lenght; counter++) {
if (pop(&head) == word[counter])
{
i++;
}
}
if(i==lenght) printf("The word is a palindrome");
else printf("The word is not a palindrome");
return 0;
}
void push(Stack**head,char value){
Stack *temp = (Stack*)malloc(sizeof(Stack));
temp->name = value;
temp->next = *head;
*head = temp;
}
char pop(Stack**head){
Stack* temp;
char val;
temp = *head;
val = temp->name;
*head = (*head)->next;
free(temp);
return val;
}