如何解决使用向量实现堆栈 - 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 举报,一经查实,本站将立刻删除。