2017-08-18 3 views
0
#include<iostream> 
#include<vector> 

using namespace std; 

class Stack 
{ 
    public: 
     int top; 
     vector<int> v; 
     Stack(int size) 
     { 
      top=0; 
      cout<<"Enter the values"<<endl; 
      for(int i=0; i<size; i++) 
      { 
       int val; 
       cin>>val; 
       v.push_back(val); 
       top++; 
      } 
     } 
     void push(int val) 
     { 
      v.push_back(val); 
      top++; 
     } 
     int pop() 
     { 
      int x=v[top]; 
      top--; 
      return x; 
     } 
     void disp() 
     { 
      for(int j=top; j<=0; j--) 
       cout<<v[j]<<' '; 
     } 
}; 

int main() 
{ 
    Stack s(3); 
    int k=s.pop(); 
    cout<<k; 
    return 0; 
} 

私はOOPの基礎を学ぼうとしています。インデックスでベクトル値にアクセスできません

ここでは、私のStackコンストラクタとプッシュ関数は正常に動作していますが、pop関数とdisp関数に問題があります。 私は、ベクトルの要素にアクセスするために不正な構文を使用していると想定しています(おそらく?)。私がどこに間違っているのか誰にでも教えてくれますか?

また、kの値は常にあなたがオフすることにより、1つのインデックスエラーが発生している0

答えて

1

ように出てきます。

クラスを実装した方法は、Nのアイテムがスタックにある場合、topの値はNです。

したがって、topは、vの要素にアクセスするための有効なインデックスではありません。あなたは使用することができます。

int pop() 
{ 
    int x=v[top-1]; 
    top--; 
    return x; 
} 

または

int pop() 
{ 
    top--; 
    int x=v[top]; 
    return x; 
} 
1

、あなたが使用できるベクトル関数

int k = s.back(); 
s.pop_back(); 
cout << k; 

より多くの情報を使用することができます組み込みベクトル関数はこれらの処理を行います(pop_backと0を参照)。。

ただし、自分で定義したい場合は、vector.at(index)機能を使用します。あなたが仕事をしているようにインデックスを使って値をアドレッシングしますが、境界チェックはしませんat()はします。これは、ベクトルのゼロベースの索引付けで索引が正しくない上記の問題を解決します。

関連する問題