【问题标题】:implementation of stacks using vector - segmentation fault in peek() function使用向量实现堆栈 - peek() 函数中的分段错误
【发布时间】:2021-08-04 13:29:29
【问题描述】:
#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() 函数中,我无法访问向量空间中的最后一个元素,返回时出现分段错误(核心转储)错误。

问题 2-> 并且在将这段代码粘贴到堆栈溢出时,我不得不在每个代码行中手动添加 4 个空格,如何一步一步执行此操作(对不起,这是一个愚蠢的问题)。

【问题讨论】:

  • vc[length] 将始终超出向量的范围。请记住,向量索引(就像数组索引一样)是基于 的。因此,具有length元素个数的向量将具有0length - 1 范围内的索引。
  • 另外,您实际上并不需要 length 变量,因为向量本身会跟踪其“长度”。要获取向量的最后一个元素,请使用 back 函数。
  • 最后你的pop 函数将不起作用。
  • vc.size()==0peek 函数中时,您必须添加更多语句以防止访问vc 的元素。
  • 要了解数组索引,请尝试数手指。从零开始。假设你有 10 根手指,那么最后一根手指应该是 9 号。10 号手指去哪儿了?

标签: c++ vector stack fault


【解决方案1】:

你的代码有几个问题:

  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,而不是查看@987654326 @ 这里。否则,向量的大小可能为正,长度为零,逻辑上为空的内容可能会打印垃圾值。

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

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

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

接下来,在 peek() 中:

cout<< vc[length]<<endl;

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

【讨论】:

  • 非常感谢您的精彩解释。
猜你喜欢
  • 2013-10-05
  • 1970-01-01
  • 2021-01-17
  • 2013-10-05
  • 2021-12-03
  • 2019-08-07
  • 2019-05-23
  • 2012-04-14
  • 1970-01-01
相关资源
最近更新 更多