Палиндром c использованием стека
наш профессор потребовал от нас проверить, является ли слово палиндромом, используя стеки.
Каждый раз, когда я запускаю его, появляется ошибка:Unhandled Exception. Access violation
что я делаю не так? Как я могу улучшить свой код? Мой код выглядит следующим образом:
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]!=''){
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");
}
6 ответов
вы должны проверить богатый конец стека или нет в вашем коде:
while(i < length && pop(&head)==word[i]){
i++;
}
Я думаю, вы должны изменить " void pop (Stack **head) {"на
char pop(Stack **head) {
а также защитите от пустого стека:
char pop(Stack**head){
Stack* temp;
char val;
temp = *head;
if (!temp) return 0;
val = temp->name;
*head = (*head)->next;
free(temp);
return val;
}
вы также можете использовать "рекурсию", которая как-то похожа на построение стека, просто это делается для ваших вызовов метода неявно.
Задача палиндрома-Это классическое упражнение для изучения силы рекурсии:)
это функция, как вы называете это:
push(&head, i, word[i]);
это функция, объявленная и определенная:
void push(Stack**head, int i, char value[i]);
так арг 3 в декларации-это массив символов, в то время как арг 3 в вызывающем часть персонажа. Измените свой push()
использовать символ для value
и просто опустить i
:
void push(Stack**head, char value){
Stack *temp = (Stack*)malloc(sizeof(Stack));
temp->name = value;
temp->next = *head;
*head = temp;
}
теперь вызовите его с:
push(&head, word[i]);
ваш код получил проблему на while-pop
часть.
для вашего удобства я прикрепил измененный рабочий код для вас:
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]!=''){
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;
}