Проверить палиндром, используя стек в C

Я новичок в C, и мне задали вопрос написать программу для проверки слов-палиндромов. Я сделал следующий код, он дает вывод. но вывод всегда "Нет". Идея того, что я сделал в этом коде, заключается в том, что я сначала разделил строку и поместил ее в один стек (stacka). затем переместил остальные письма в другой стек (stackb). Затем я извлекаю оба этих стека и проверяю, равны ли буквы, возвращаемые каждой функцией pop (stacka и stackb), или нет. если нет, он вернет 0. ниже приведен код. Заранее спасибо. Хорошего дня!.

#include <stdio.h>

#include <string.h>

char stacka[5];
char stackb[5];
int topa = -1;
int topb = -1;

void pusha(char e) {
    topa++;
    stacka[topa] = e;
}
void pushb(char e) {
    topb++;
    stackb[topb] = e;
}
char popa() {
    char e = stacka[topa];
    topa--;
    return e;
}
char popb() {
    char e = stackb[topb];
    topb--;
    return e;
}
int palindrome(char str[]) {
    int i, length = strlen(str);

    int mid = length / 2;
    for (i = 0; i < mid; i++) {
        pusha(str[i]);
    }
    if (length % 2 != 0) {
        i++;
    }
    for (i = length - 1; i >= mid; i--) {
        pushb(str[i]);
    }
    int f;
    for (f = mid; f >= 0; f--) {
        char ele1 = popa();
        char ele2 = popb();

        if (ele1 != ele2)
            return 0;
    }
    return 1;

}

int main() {
    char str[] = "madam";

    if (palindrome(str)) {
        printf("Yes");

    } else
        printf("No");
}

Какую отладку вы пробовали и каков был результат?

DarthQuack 22.12.2020 08:08

@a.Li результат всегда один и тот же, каждый раз будет возвращаться да или нет. но ответ неверный.

Bhagya Amarasinghe 22.12.2020 08:14

Извините, но это звучит слишком запутанно. Почему бы вам просто не сравнить символы, начиная с крайних, это требование задания?

Bob__ 22.12.2020 08:14

Есть ли причина, по которой вы решили использовать стек? Это выполнимо, но немного запутанно. Вы можете найти Как убрать пробелы и проверить, является ли строка палиндромом? Короче, если это интересно.

David C. Rankin 22.12.2020 08:27

Используйте GCC как gcc -Wall -Wextra -g, а затем используйте GDB, чтобы понять поведение вашего исполняемого файла.

Basile Starynkevitch 22.12.2020 08:28

Вам действительно нужно запустить его под отладчиком. Прочтите, как настроить его на своем компьютере, или используйте, например. онлайнgdb. Отладка — это не просто запуск вашей программы и просмотр результатов — есть инструмент, называемый отладчиком, который позволяет вам видеть состояние программы «изнутри», а не снаружи (просто глядя на напечатанные результаты).

Kuba hasn't forgotten Monica 22.12.2020 08:40
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
6
291
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

На первый взгляд, я обнаружил следующие проблемы в вашем коде.

if (length % 2 !=0)
{
    i++;
}
for(i=length-1;i>=mid;i--)
{
    pushb(str[i]);
}

Ваш блок if не влияет на код, да и не нужен. for loop также имеет проблему, которая может вызвать вашу проблему.

Позвольте мне немного уточнить. Допустим, ваш ввод «мадам», и, согласно вашему решению, первый цикл for работает нормально.

int mid=length/2;
for(i=0;i<mid;i++)
{
    pusha(str[i]);
}

Поскольку вы вводите «мадам», ваше значение для mid будет 2. поэтому первая стопка будет содержать буквы «м», «а». Это нормально до этого.

Во втором for loop есть проблема,

for(i=length-1;i>=mid;i--)
{
    pushb(str[i]);
}

В соответствии с этим стек будет содержать 'm', 'a', 'd'.

Теперь я бы сказал поправку здесь по моему мнению. Прежде всего, вы удаляете первый блок if, затем делаете эту модификацию во втором for loop.

for(i=length-1;i>mid;i--)
{
    pushb(str[i]);
}

Затем, наконец, в последний for loop,

for(f=mid-1;f>=0;f--)
{
   char ele1=popa();
   char ele2=popb();
   if (ele1!=ele2)
     return 0;
}

Я не компилировал и не запускал код с моими исправлениями. Но я думаю, что это поможет вам разобраться в проблемах с вашим кодом.

Есть несколько проблем с кодом, но этот ответ указал только на одну из них. Удаление оператора if не заставит программу работать.

RabidBear 22.12.2020 08:23

தலைவா எனக்கு ஆங்கிலம் நல்லா வராது.

Сначала вы измените условие цикла for в функции палиндрома.

for(i=length-1;i>mid;i--)
{
    pushb(str[i]);
}

Ваша программа правильная.

Вы можете удалить этот повторяющийся ответ.

Blastfurnace 22.12.2020 13:24
Ответ принят как подходящий

Сначала вы измените условие цикла for в функции палиндрома.

for(i=length-1;i>mid;i--)
{
    pushb(str[i]);
}

Другие вопросы по теме