簡體   English   中英

使用向量實現堆棧 - peek() function 中的分段錯誤

[英]implementation of stacks using vector - segmentation fault in peek() function

#include <iostream>
#include <vector>

using namespace std;

class Stack{
  public:
  vector<string> vc;
  int length=0;

  void peek(){
     if(vc.size()==0){
         cout<< "The stack is empty"<<endl;
     }
     cout<< vc[length]<<endl; //----> does not work;
     //cout<<vc[vc.size()-1]; ---> does not work either
     //cout<<vc.end(); ----> does not work either;
  }

  void add(string value){
      vc.push_back(value);
      length++;
  }

  void pop(){
      vc.erase(vc.end());
      length--;
  }

  void show(){
    for (int i=0;i<vc.size();i++){
        cout << vc[i] << " ";
    }
    cout<<endl;
  }


};

int main()
{
    Stack mystack;
    mystack.peek();
    mystack.add("Hello");
    mystack.peek();
    mystack.add("frands");
    mystack.add("chai");
    mystack.add("pee");
    mystack.add("lo");
    mystack.show();
    mystack.peek();
    mystack.pop();
    mystack.show();
}

問題 1-> 問題出現在 peek() function 我無法訪問向量空間中的最后一個元素,我返回一個分段錯誤(核心轉儲)錯誤。

問題 2-> 並且在將此代碼粘貼到堆棧溢出時,我不得不在每個代碼行中手動添加 4 個空格,如何一步一步執行此操作(對不起,這是一個愚蠢的問題)。

你的代碼有幾個問題:

  void peek(){
     if(vc.size()==0){
         cout<< "The stack is empty"<<endl;
     }
     cout<< vc[length]<<endl; //----> does not work;
  }

如果 vc.size() == 0,則打印出一條消息,然后繼續對空向量進行索引。 您應該在if內部返回,以避免查看無效索引。

在它下面你使用一個length變量,我認為它是向量大小()的作用。 您需要確保向量的大小與堆棧的邏輯大小相同(然后您不需要length變量),或者您應該測試length是否 == 0,而不是在這里查看size() 否則,向量的大小可能為正,長度為零,邏輯上為空的內容可能會打印垃圾值。

另一個嚴重的錯誤,你的pop function:

void pop(){
    vc.erase(vc.end()); // <<< MISTAKE
    length--;
}

這是擦除“結束”元素,它不是要擦除的有效 position。 請記住, end表示向量中最后一個有效元素之后的第一個位置,因此您的代碼會產生未定義的行為。 您應該使用向量 function pop_back代替,因為它正是您想要的。 它還將減小向量的大小,這意味着您根本不需要length變量。 相反,您可以使用向量的 size()。

接下來,在 peek() 中:

cout<< vc[length]<<endl;

當向量包含 N 個事物時,它們的索引從 0..(N-1) 開始。 使用元素的數量會 go 太遠進入向量。 相反,使用length-1 (或修復 pop() 后的vc.size()-1 )。 但是,您可以使用vc.back()訪問最后一個元素,而無需計算其偏移量。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM