c++ - 基于堆栈的回文检查器

标签 c++ stack palindrome

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

最佳答案

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

    case'd':
            {
                    original.~stack();

关于c++ - 基于堆栈的回文检查器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/723830/

相关文章:

Java 堆栈简单纸牌

algorithm - 在链表中查找回文

c++ - 编译器如何决定是否值得让我的函数内联?

c++ - 如何在不退出 do while 循环的情况下验证输入?

stack - 如何在apollo-client中实现注销

python - 检查数字是否为回文而不将其更改为字符串

javascript - 我需要添加什么代码来反转文本框输入?

c++ - 使用 QPointer 和 QObject::connect 与 C++11

c++ - 光线追踪:为什么我的球体呈现为椭圆形?

Python堆栈重叠元素累加