微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

#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 个空格,如何一步完成(抱歉问了一个愚蠢的问题)。

解决方法

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

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

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

在它下面你使用一个 length 变量,我认为它扮演了向量 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) 开始索引。使用元素的数量会在向量中走得太远。相反,在修复 pop() 后使用 length-1(或 vc.size()-1)。但是,您可以使用 vc.back() 访问最后一个元素,而无需计算其偏移量。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。