使用向量实现堆栈 - peek() 函数中的分段错误

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() 函数中,我无法访问向量中的最后一个元素 space 我返回时出现分段错误(核心转储)错误。

问题 2-> 在将此代码粘贴到堆栈溢出时,我不得不在每个代码行中手动添加 4space 如何一步完成此操作(抱歉提出了一个愚蠢的问题)。

您的代码中存在一些问题:

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

如果vc.size() == 0,则打印出一条消息,然后继续索引到空向量中。您应该在 if 中 return,以避免查看无效索引。

在它下面你使用了一个length变量,我推测它是在扮演vector的size()的角色。您需要确保向量的大小与堆栈的逻辑大小相同(然后您不需要 length 变量),或者您应该测试 length == 0,而不是在这里查看 size()。否则,你可能有一个正大小的向量,长度为零,逻辑上为空的可能会打印垃圾值。

另一个严重的错误,你的 pop 函数:

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

这是擦除“结束”元素,该元素不是要擦除的有效位置。请记住,end 表示向量中最后一个有效元素 之后的第一个位置 ,因此您的代码会产生未定义的行为。您应该改用向量函数 pop_back,因为它正是您想要的。它还会减小向量的大小,这意味着您根本不需要 length 变量!相反,您可以使用矢量的 size().

接下来,在 peek() 中:

cout<< vc[length]<<endl;

当一个向量包含N个东西时,它们的索引从0..(N-1)开始。使用元素的数量会在向量中走得太远。相反,使用 length-1(或修复 pop() 后的 vc.size()-1)。但是,您可以使用 vc.back() 访问最后一个元素,而无需计算其偏移量。