0

我的程序有问题。它应该是通过堆栈识别回文的程序。一切都很好,唯一不起作用的是在功能完成后打印堆栈(原始和反向)。这是我的整个代码,问题在于案例 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');
}
4

3 回答 3

1

您已经明确调用了堆栈的析构函数。这样做几乎没有充分的理由。如果堆栈是本地的(“在堆栈上”,嘻嘻),编译将为您完成。如果它在堆上,使用创建new,调用delete它,这将导致编译器调用析构函数。

    case'd':
            {
                    original.~stack();
于 2009-04-07T01:18:34.067 回答
0

有几件事我想回应一下。首先,我认为 GMan、tpdi 和 Vinay 都有优点。这个常见问题解答解释了为什么在局部变量上调用析构函数是一个坏主意。

我意识到这只是一个简单的家庭作业问题,您可能只是想保持堆栈类的轻量级,但您可能会考虑在堆栈类中使用容器类而不是字符数组

接下来,我不确定您的 emptystack 和 create 函数是否在做您认为他们正在做的事情。当您在主程序中声明原始堆栈类和反向堆栈类时,将为您的内部字符数组分配内存。在这种情况下,实际上不需要创建函数。也许如果您在堆上为字符数组分配内存,您会将该代码放入 create 函数中(如果您出于某种原因选择将其排除在构造函数之外),但这里不是这种情况。

同样,emptystack 并没有真正做任何事情。最好让空堆栈将 stop 成员变量设置为 0。至少这样,下次有人尝试使用它时堆栈看起来是空的。

关于这个类还有很多可以说的,但是如果你在这里尝试一些建议,比如使用 std::stack 和调试,可能会更好。毕竟,这是您的家庭作业:如果您自己找到解决方案,它将来帮助您更多!

于 2009-04-07T02:56:41.100 回答
0

你评论了回文阅读:)

//cin.getline(palindrome,MAXSTACK);
于 2009-04-07T01:19:54.140 回答