假設現在有一個棧,長度num=5,len表示棧中已有的元素,arraylen表示棧的總容量。
假設有方法pop用來彈出棧中的元素,有方法push用來壓入元素。
分別給出構造函數和pop方法。
MyStack::MyStack(int num) { a = new int[num]; len = 0; arraylen = num; } int MyStack::pop() { return a[--len]; } void MyStack::push(int num) { if (len == arraylen) { resize(arraylen * 2); arraylen *= 2; } a[len++] = num; }
由pop方法中可以看到,所執行的操作為:先將len-1,然后返回元素a[len];
那么問題來了
假設len=5,將第五個元素返回后,len=4.。
此時第五個元素是被刪除了還是僅僅還是無法訪問到這個元素?
在函數中添加代碼來手動訪問第五個位置的元素,代碼如下
int MyStack::test(int num) { return a[num]; }
在main函數中添加代碼
int main() { MyStack stack(5); stack.push(7); stack.push(2); stack.push(5); stack.push(8); stack.push(3); stack.pop(); cout <<"現在棧中有"<<stack.size()<<"個元素,分別是"<<stack.showstack()<<endl<<stack.test(4); }
即,新建一個棧,並往棧中添加五個元素,並彈出第五個元素,此時cout的內容為
由此可以發現,pop並不會刪除這個元素,而是讓這個元素不能再被直接訪問,這個元素依然存在於數組中。
但是這並不會影響棧的壓入和彈出操作,因為當進行壓入操作時(假如在彈出第五個元素之后再壓入一個數x),之前這個位置的元素會被新壓入的元素替換掉。
雖然看起來沒有什么問題,但是為了保險起見,仍然應當在彈出這個元素之后,將這個地址的值設置為null,代碼如下
int MyStack::pop() { int num = a[len-1];//獲取這個位置的值 a[--len] = NULL;//將這個位置的值設置為null return num;//返回這個值 }
然后輸出結果就變為