[英]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() function 我無法訪問向量空間中的最后一個元素,我返回一個分段錯誤(核心轉儲)錯誤。
問題 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
變量,我認為它是向量大小()的作用。 您需要確保向量的大小與堆棧的邏輯大小相同(然后您不需要length
變量),或者您應該測試length
是否 == 0,而不是在這里查看size()
。 否則,向量的大小可能為正,長度為零,邏輯上為空的內容可能會打印垃圾值。
另一個嚴重的錯誤,你的pop
function:
void pop(){
vc.erase(vc.end()); // <<< MISTAKE
length--;
}
這是擦除“結束”元素,它不是要擦除的有效 position。 請記住, end
表示向量中最后一個有效元素之后的第一個位置,因此您的代碼會產生未定義的行為。 您應該使用向量 function pop_back
代替,因為它正是您想要的。 它還將減小向量的大小,這意味着您根本不需要length
變量。 相反,您可以使用向量的 size()。
接下來,在 peek() 中:
cout<< vc[length]<<endl;
當向量包含 N 個事物時,它們的索引從 0..(N-1) 開始。 使用元素的數量會 go 太遠進入向量。 相反,使用length-1
(或修復 pop() 后的vc.size()-1
)。 但是,您可以使用vc.back()
訪問最后一個元素,而無需計算其偏移量。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.