Наш учитель дал нам домашнее задание проверить палиндром слова, используя структуру данных «Стек».
Ниже приведен код, который я написал для следующей проблемы: -
# include <stdio.h>
# include <stdlib.h>
# include <string.h>
# include <stdbool.h>
struct Stack
{
int top;
int capacity;
char *array;
};
void push(struct Stack stack, char a) //Push function.
{
stack.array[++stack.top] = a; //Helps to push charater to a stack.
}
char pop(struct Stack stack) //Pop function.
{
return stack.array[stack.top--]; //Helps to pop character from a stack.
}
int main(void)
{
struct Stack original; //Original stack where the "Original" word will be pushed.
original.top = -1;
original.capacity = 10;
original.array = calloc(original.capacity, sizeof(char));
struct Stack checker; //Another stack that "Checks" whether the word is palindrome or not.
checker.top = -1;
checker.capacity = 10;
checker.array = calloc(checker.capacity, sizeof(char));
while(getchar()!='\0') //Getting all the characters from the stdin buffer and pushing it into "Original" stack.
{
push(original, getchar());
}
while(original.top != -1)
{
push(checker,pop(original)); //Popping from "Original" stack and pushing it to "Checker" stack.
}
while(checker.top != -1)
{
original.top = checker.top;
if(original.array[original.top] != checker.array[checker.top]) //Checking every character in the stack if it is excatly same or not.
{
printf("It is not a palindrome.\n");
return EXIT_SUCCESS;
}
else
{
checker.top = checker.top - 1;
}
}
if(checker.top == -1)
{
printf("It is a palindrome.\n");
}
return 0;
}
Однако у меня возникает проблема в следующей строке: -
while(getchar()!='\0') //Getting all the characters from the stdin buffer and pushing it into "Original" stack.
{
push(original, getchar());
}
Следующий цикл работает бесконечно. Моя цель добавления следующей строки состоит в том, что я хочу добавить отдельные символы из stdin buffer
и push
в стек original
, пока он не встретит '\0'
.
Что я здесь сделал не так? Это незаконно, чтобы сделать это таким образом?
Дополнение: -
Пример входных данных 1: - гражданский
Ожидаемый результат: - Это палиндром.
Образец входных данных 2: - мадам
Ожидаемый результат: - Это не палиндром.
P.S.
Следующий код: -
while(getchar()!='\0') //Getting all the characters from the stdin buffer and pushing it into "Original" stack.
{
push(original, getchar());
}
теперь заменено на: -
int c;
int i = 0;
while ( i < original.capacity && ( c = getchar() ) != EOF && c != '\n' )
{
push(original, c );
++i;
}
И теперь работает отлично, однако теперь для каждого слова мой код дает результат: -
Это палиндром.
Где я неправильно применил концепцию стека?
getchar()
читает'\0'
из текстового файла. Мало того, вы выбрасываете прочитанный символ и нажимаете следующий. - person Weather Vane   schedule 27.09.2019getchar()
не может прочитать'\0'
изstdin
? - person Swarnim Khosla   schedule 27.09.2019EOF
означает конец файла/ввод - person KamilCuk   schedule 27.09.2019char c
? - person Swarnim Khosla   schedule 27.09.2019char
. Я думаю, что почти нет (если вообще есть) библиотечных функций, которые используют символы, которые принимают или возвращают типchar
, обычно этоint
. Однако строка — это другое дело, обычно это массивchar
. В этом случае есть 256 возможных значений символов: но также естьEOF
для представления. - person Weather Vane   schedule 27.09.2019