使用向量实现堆栈 - 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()
访问最后一个元素,而无需计算其偏移量。
#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()
访问最后一个元素,而无需计算其偏移量。