0

さまざまなデータ構造を実装するコードを練習しています。この例では、単純なスタック データ構造を実装しようとしています。これまでのところ意図したとおりに動作しますが、スタックを表示しようとすると 16 進数の文字が表示され続けます。なぜこれが当てはまるのかを理解するのを手伝ってくれる人はいますか?

また、私は自分のコードを適切に構造化することを改善しようとしています。すでに業界に携わっている人は、私がこれまでにコーディングしたことについて建設的な批判をしてください. ありがとう。

#include <iostream>

using namespace std;

// stack_MAX == maximum height of stack
const int stack_MAX = 10;

class stack{
    public:
        stack(){
        //Constructor initializes top of stack
            top = -1;
        }

        bool isFull(int top){
        //isFull() will check to make sure stack is not full
        //Will return TRUE if stack is FULL, and FALSE if 
        //stack is NOT FULL
            if(top == stack_MAX - 1)
                return true;
            else
                return false;
        }

        bool isEmpty(int top){
        //isEmpty() will check to make sure stack is not empty
        //Will return TRUE if stack is EMPTY, and FALSE if
        //stack is NOT EMPTY
            if(top == -1)
                return true;
            else
                return false;
        }

        void push(int x){
        //push() will push new element on top of stack
            if(isFull(top)){
                cout << "Sorry, but the stack is full!" << endl;
                exit(1);
            }
            else{
                top++;
                x = stk[top];
            }
        }

        void pop(){
        //pop() will pop the top element from the stack
            if(isEmpty(top)){
                cout << "Sorry, but the stack is empty!" << endl;
                exit(1);
            }
            else{
                cout << stk[top] << " is being popped from stack!" << endl;
                top--;
            }
        }

        void display_stack(){
        //diplay_stack() will show all elements currently in the stack
            int temp;   //will temporarily hold position of stack
            temp = top;
            while(!isEmpty(temp)){
                cout << stk[temp] << endl;
                temp--;
            }
        }
    private:
        int top;
        int stk[stack_MAX];
};

int menu(){

    int choice;

    cout << "Welcome to my stack!" << endl;
    cout << "What would you like to do? (select corresponding #)" << endl << endl;

    cout << "1. Push" << endl;
    cout << "2. Pop" << endl;
    cout << "3. Display" << endl;
    cout << "4. Quit" << endl;

    cin >> choice;

    return choice;
}

int main()
{
    int selection, x;

    stack myStack;

    selection = menu();

    while(selection != 4)
    {
        switch(selection){
            case 1:
                cout << "please enter number to be pushed: ";
                cin >> x;
                myStack.push(x);
                selection = menu();
                break;
            case 2:
                myStack.pop();
                selection = menu();
                break;
            case 3:
                myStack.display_stack();
                selection = menu();
                break;
            default:
                cout << "Oops that's not a selection, try again" << endl;
                selection = menu();
                break;
        }
    }

    cout << "Thank you for stopping by and using my stack!" << endl;
    system("pause");
    return 0;
}
4

2 に答える 2

3

次のように変更された、関数内のステートメントpushが間違っています。

void push(int x)
{
    //push() will push new element on top of stack
    if(isFull(top))
    {
        cout << "Sorry, but the stack is full!" << endl;
        exit(1);
    }
    else
    {
        top++;
        /***************************
        x = stk[top];
        ****************************/
        stk[top] = x;
    }
}

アドバイス:

  • デバッグを学ぶ、ここにチュートリアルがあります
  • コードでcstdlib使用する場合は head ファイルを含めますexit
  • クラスに STL のクラスと同じ名前を付けないでください
于 2013-05-14T01:01:19.140 に答える
0

先史時代のペンギンが指摘したように、あなたの push() 関数は正しくありません:

x = stk[top];

次のように変更する必要があります。

stk[top] = x;

あなたが要求したように、いくつかの一般的なコメントを提供するために、とにかくコメントしたかったのです。

  • このような if ステートメントは、1 行のコードに置き換えることができます。

        if(top == stack_MAX - 1)
            return true;
        else
            return false;
    

になります:

return (stack_MAX - 1 == top);
  • 定数式は比較式の左側に置きます。例えば:

    (top == stack_MAX - 1)

になります:

(stack_MAX - 1 == top)

その理由は、ある日、誤って次のようなものを入力するからです。

(top = stack_MAX - 1)

そして、あなたや他の誰かがそれをデバッグするのに多くの時間を浪費するでしょう:)

  • isFull() および isEmpty() 関数はパラメーターを取らないでください。プライベート メンバー変数 top のみを使用する必要があります。あなたが正しくプライベートメンバーにしたトップにアクセスせずに、誰かがこれらの関数をどのように呼び出すでしょうか?

  • 一般的には避けてくださいusing。私の意見では、名前空間の目的全体が無効になります。名前空間 std の使用は一般的に使用される例外ですが、それでも std::cout と入力するのは難しいですか?

  • if ステートメントの句は、1 行であっても常に中かっこで囲みます。後で句にさらにステートメントを追加する必要がある場合、中括弧を追加するのを忘れがちです。これは非常に混乱を招く可能性があります。

  • コードの書式設定はかなり適切ですが、ブラケット スタイルを選択して一貫性を持たせてください。関数ヘッダー/制御ステートメントなどと同じ行に開始中括弧を常に配置するか、常にその後の行に配置します。

それが役立つことを願っています。

于 2013-05-14T01:24:02.767 に答える