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

回文の読み方にコメントしました:)

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

いくつかお答えしたいことがあります。まず、GMan、tpdi、Vinay にはそれぞれ良い点があると思います。このFAQでは、ローカル変数でデストラクタを呼び出すことがなぜ悪い考えなのかを説明しています。

これは単純な宿題の問題であり、おそらくスタック クラスを軽量に保とうとしているだけだと思いますが、スタック クラスで文字の配列の代わりにコンテナー クラスを使用することを検討することもできます。

次に、あなたの emptystack と create 関数が、あなたが思っていることを行っているかどうかわかりません。メイン プログラムで元のスタック クラスと逆スタック クラスを宣言すると、メモリが内部文字配列に割り当てられます。この場合、create 関数を持つ必要はありません。おそらく、文字配列のヒープにメモリを割り当てる場合は、そのコードを create 関数に入れます (何らかの理由でコンストラクターから除外することを選択した場合) が、ここではそうではありません。

同様に、 emptystack は実際には何もしていません。空のスタックで stop メンバー変数を 0 に設定する方がよいでしょう。少なくともそのようにすると、次に誰かがスタックを使用しようとしたときにスタックが空に見えるでしょう。

このクラスについて言えることは他にもたくさんありますが、std::stack の使用やデバッグなど、ここでの提案のいくつかを試した方がよいかもしれません。結局のところ、これはあなたの宿題です: 自分で解決策を見つければ、将来もっと役立つでしょう!

于 2009-04-07T02:56:41.100 に答える