2017-09-26 1 views
0

私は、スタッククラスからの数値のプッシュ/ポップに関するC++ブックのサンプルコードを書いて変更しました。これは私の理解のための基本的な質問です。ここにコードがあります。C++でプッシュ/ポップスタッククラスプログラム?

//stakarray.cpp 
//a stack as a class 
#include <iostream> 
using namespace std; 

class Stack 
{ 
    private: 
    enum { MAX = 10 }; 
    //int MAX=10; 
    int st[MAX]; 
    int top; 
    public: 
    Stack() 
    { top=0; } 
    void push(int var) 
    { st[++top]=var; } //increments stack, input var 
    int pop() 
    { return st[top--]; } //returns var, decrements stack 
    void show(int var) 
    { cout << st[var]<< endl; } 
}; 
int main() 
{ 
    //some stack operations 
    int i; 
    Stack s1; 
    s1.push(11); 
    s1.push(22); 
    cout<<"1: "<<s1.pop()<<endl; //22 
    cout<<"2: "<<s1.pop()<<endl; //11 
    s1.push(33); 
    s1.push(44); 
    s1.push(55); 
    s1.push(66); 
    for (i=0; i<= 10 ; i++) 
    { 
    cout<< "s1[" << i << "]= "; 
    s1.show(i); 
    } 
    return 0; 
} 

このプログラムの出力は

1: 22 
2: 11 
s1[0]= 2 
s1[1]= 33 
s1[2]= 44 
s1[3]= 55 
s1[4]= 66 
s1[5]= 0 
s1[6]= 0 
s1[7]= 0 
s1[8]= 4196896 
s1[9]= 0 
s1[10]= 4 

を与えるなぜS1 [0] = 2、S 1 [8] = 4196896、S1 [10] = 4?プライベートからMAXにアクセスする方法もありますか?クラス内のどこか他の場所で定義する必要がありますか?(グローバル変数またはmain()の一部として使用しないでください)

+4

デバッガを使用してコードをステップ実行して、各行で何が起こるかを確認するような音がします。 – NathanOliver

答えて

2

要素0は、プッシュではポストインクリメント(top ++)の代わりにプリインクリメント(++ top)を使用するため、使用されることはありません。

スタックには一度に最大4つの要素があるため、インデックス4に続くすべての要素には未定義のコンテンツ(つまり、s1 [5] ... s1 [10]のランダムなガベージ)があります。

1

コードでは、値を設定する前に、プリインクリメント++topで先頭をインクリメントしていました。したがって、topは1になり、s1[1]=33に設定されます。ポストインクリメントtop++に切り替えると、カウンタ変数tops[0]=33に設定された後に増加します。

//stakarray.cpp 
//a stack as a class 
#include <iostream> 
using namespace std; 

class Stack 
{ 
    private: 
    enum { MAX = 10 }; 
    //int MAX=10; 
    int st[MAX]; 
    int top; 
    public: 
    Stack() 
    { top=0; } 
    void push(int var) 
    { st[top++]=var; } //increments stack, input var 
    int pop() 
    { return st[top--]; } //returns var, decrements stack 
    void show(int var) 
    { cout << st[var]<< endl; } 
}; 
int main() 
{ 
    //some stack operations 
    int i; 
    Stack s1; 
    s1.push(11); 
    s1.push(22); 
    cout<<"1: "<<s1.pop()<<endl; //22 
    cout<<"2: "<<s1.pop()<<endl; //11 
    s1.push(33); 
    s1.push(44); 
    s1.push(55); 
    s1.push(66); 
    for (i=0; i<= 10 ; i++) 
    { 
    cout<< "s1[" << i << "]= "; 
    s1.show(i); 
    } 
    return 0; 
}