Стек палиндромной проверки - PullRequest
0 голосов
/ 07 апреля 2009

У меня проблема с моей программой. Это должна быть программа, которая распознает палиндом через стек. Все работает отлично, единственное, что не работает - это печать стопок (оригинальных и перевернутых) после выполнения функции. Вот весь мой код, и проблема в случаях d и e:

#include <iostream>

using namespace std;


const int MAXSTACK = 21;
class stack {
private:
    int  stop;  
    char stk[MAXSTACK];
public:
    stack();
    ~stack();
    stack(const stack& s);
    void push(const char c);
    char pop();
    char top(void);
    int  emptystack(void);
    int  fullstack(void);
    void stack_print(void);
    int stack::create(void);
};
stack::stack()
{
    stop = 0;
}
stack::~stack() { }  
stack::stack(const stack& s)
{
    stop = s.stop;
    strcpy(stk,s.stk);
}
void stack::push(const char c)
{
    stk[stop++] = c;
}
char stack::pop()
{
    return stop--;
}
char stack::top(void)
{
    return stk[stop - 1];
}
int  stack::emptystack(void)
{
    return !stop; 
}
int  stack::fullstack(void)
{
    return stop == MAXSTACK;
}
void stack::stack_print(void)
{
    for (int i=0; i<stop; i++)
        cout<<stk[i];
    cout<<endl;
}
int  stack::create(void)
{
    return !stop; 
}
char menu()
{

    char volba;

    cout<<"\n";
    cout<<" **********.\n";
    cout<<"\n";
    cout<<" a ... make new containers\n";
    cout<<" b ... delete content\n";
    cout<<" c ... enter string\n";
    cout<<" d ... print on screen first stack\n";
    cout<<" e ...  print on screen first stack\n";
    cout<<" f ... is it palindrom\n";
    cout<<" x ... exit\n";
    cout<<"\n your choice : ";

    cin >>  volba;
    return volba;
}
int main() {
    char  palindrome[MAXSTACK]; 
    char volba;
    stack original,reversed;
    int   stackitems = 0,i;
    //cin.getline(palindrome,MAXSTACK);
    do{
        volba = menu();
        switch (volba)
        {
        case'a':
            {
                original.create();
                reversed.create();
                cout<<"done'";
                break;
            }
        case'b':
            {
            original.emptystack();
            reversed.emptystack();
            cout<<"empty";
            break;
            }
        case'c':
            {
                cout<<"enter your string"<<endl;
            cin.get();
            //cin.get();
            cin.getline(palindrome,MAXSTACK);
    for(int o = 0; o < strlen(palindrome); o++)

        if (isalpha(palindrome[o]))
        {
            original.push(tolower(palindrome[o]));
            stackitems++;                           
        }
            original.stack_print();

        break;
            }
        case'd':
            {
                original.~stack();
                for(int g = 0; g < strlen(palindrome); g++)
                original.push(tolower(palindrome[g]));
                original.stack_print();
            }
            /*//cin.getline(palindrome,MAXSTACK);
    for(int g = 0; g < strlen(palindrome); g++)

        if (isalpha(palindrome[g]))
        {
            original.push(tolower(palindrome[g]));
            stackitems++;                           
        }

            }
            original.stack_print();*/
            break;


        /*{
                cout<<"original: ";
        original.stack_print();
                break;
            }*/
            break;
        case'e':
            {
            cout<<"reversed:"<<endl;
            for( i = 0; i < stackitems; i++) {
            reversed.push(original.top());
            original.pop();
        }
        reversed.stack_print();
            }
            break;

        case'f':
            {
            for( i = 0; i < stackitems / 2; i++) {
            reversed.push(original.top());
            original.pop();
        }


        if (stackitems % 2)
            original.pop();

        while (!original.emptystack()) {
            if (original.top() != reversed.top()) break;
            original.pop(); reversed.pop();
        }
        if (original.emptystack())
            cout << "it is palindrom\n";
        else
            cout << "not palindrom\n";

        break;

            }
        default:cout<<"!??!";


        }
    } while(volba!='x');
}

Ответы [ 3 ]

1 голос
/ 07 апреля 2009

Вы явно вызвали деструктор вашего стека. Почти никогда нет веских причин для этого. Если стек локальный («в стеке», хи-хи), компиляция сделает это за вас. Если он находится в куче, созданной с new, вызовите delete для него, что заставит компилятор вызвать деструктор.

    case'd':
            {
                    original.~stack();
0 голосов
/ 07 апреля 2009

Я бы хотел ответить на несколько вопросов. Во-первых, я думаю, что у GMan, TPPI и Vinay есть хорошие моменты. В этом FAQ объясняется, почему вызов деструктора для локальной переменной является плохой идеей.

Я понимаю, что это просто простая домашняя задача, и вы, вероятно, просто пытаетесь облегчить свой класс стека, но вы могли бы рассмотреть использование класса контейнера вместо массива символов в вашем классе стека.

Далее, я не уверен, что ваши функции emptystack и create делают то, что вы думаете, они делают. Когда вы объявляете свои исходные и обращенные классы стека в основной программе, память выделяется для вашего внутреннего массива символов. В этом случае нет необходимости иметь функцию создания. Возможно, если бы вы выделяли память в куче для вашего символьного массива, вы бы поместили этот код в функцию create (если по какой-то причине решили оставить его вне конструктора), но здесь это не так.

Точно так же emptystack ничего не делает. Было бы лучше, если бы в пустом стеке переменная стоп-элемента была установлена ​​на 0. По крайней мере, таким образом стек будет казаться пустым в следующий раз, когда кто-то попытается его использовать.

Можно еще много сказать об этом классе, но было бы лучше, если бы вы попробовали некоторые из предложенных здесь советов, таких как использование std :: stack и отладка. Это, в конце концов, ваше домашнее задание: оно поможет вам намного больше в будущем, если вы сами найдете решение!

0 голосов
/ 07 апреля 2009

Вы прокомментировали чтение палиндрома:)

//cin.getline(palindrome,MAXSTACK);
...