資料結構第一篇 棧
棧的特性
棧 的特性是先進後出。
棧的思考
壓棧操作是將新元素壓入陣列的尾部,而不是頭部。在陣列的頭部插入元素是一個很耗時的操作,它的時間複雜度為 O(n),因為需要將現有元素往後移位為新元素騰出空間。而在尾部插入元素的時間複雜度為 O(1);無論陣列有多少元素,這個操作所消耗的時間都是一個常量。
棧在移動端 iOS開發中最常見的場景
棧在iOS開發中常見的是導航棧,push pop 操作就是這種進棧出棧的操作。
具體自己實現棧的操作方式
DSStack *testStack = [[DSStack alloc] initWithSize:4];
[testStack push:@"1"];
[testStack push:@"2"];
[testStack push:@"5"];
[testStack popLastObject];
NSLog(@"%@",testStack);
下面自己實現一個棧結構主要是用陣列實現。大致看幾個關鍵方法:
- (instancetype)initWithSize:(NSUInteger)size
{
self = [super init];
if (self) {
if (size > 0) {
_stackArray = [[NSMutableArray alloc] initWithCapacity:size];
_maxStackSize = size;
}
else {
NSAssert(size != 0, @"Stack size must be > 0");
}
}
return self;
}
初始化給定大小,這樣是有好處的。因為如果陣列容量滿的時候為了增加容量,頻繁的動態建立陣列 copy陣列會消耗一定的記憶體
- (void)push:(id)object
{
if ([self isFull] && self.maxStackSize) {
NSMutableArray *newArray = [[NSMutableArray alloc] initWithCapacity:_maxStackSize*2];
self.stackArray = [newArray mutableCopy];
_maxStackSize = _maxStackSize*2;
}
if (object != nil) {
[self.stackArray addObject:object];
}
else {
NSAssert(object != nil, @"You can't push nil object to stack");
}
}
如果當前陣列填充滿了 則建立一個兩倍容量的陣列copy一份給原來的陣列
- (id)popLastObject
{
id object = [self peek];
[self.stackArray removeLastObject];
return object;
}
如果當前陣列不為空,存在陣列最後一個物件則直接返回 並移除掉。
提問:朋友說擴充兩倍可能浪費空間。
提供了一個初始化傳入size的值是為了預估空間比較合理。如果沒有預估好,頻繁擴容會造成不斷申請記憶體然後copy。舉個例子提前初始化容量和不指定容量的對比效果圖看下圖:
為了避免這個問題提供一個壓縮空間的方法
- (void)compressedStack
{
int capacitySize = (int)(_maxStackSize * 0.9);
int stackSize = (int)(self.stackArray.count);
if( stackSize < capacitySize ) {
NSMutableArray *newArray = [[NSMutableArray alloc] initWithCapacity:stackSize];
self.stackArray = [newArray mutableCopy];
_maxStackSize = stackSize;
}
}
如果當前棧內元素個數小於容量的90% 那麼壓縮棧把容量設定為當前棧的實際元素個數
相關文章
- JS版資料結構第一篇(棧)JS資料結構
- 資料結構-棧資料結構
- 資料結構 - 棧資料結構
- 資料結構之「棧」資料結構
- 資料結構之——棧資料結構
- javascript資料結構 -- 棧JavaScript資料結構
- 資料結構之棧資料結構
- 資料結構(1):棧資料結構
- 資料結構與演算法-資料結構(棧)資料結構演算法
- Java版-資料結構-棧Java資料結構
- js資料結構之棧JS資料結構
- JavaScript資料結構之-棧JavaScript資料結構
- 資料結構03-棧資料結構
- 資料結構:棧詳解資料結構
- JavaScript資料結構之棧JavaScript資料結構
- js資料結構--棧(stack)JS資料結構
- JavaScript資料結構02 - 棧JavaScript資料結構
- 波波的資料結構-棧資料結構
- 資料結構筆記——棧資料結構筆記
- 資料結構—棧/佇列資料結構佇列
- Python資料結構——棧Python資料結構
- 資料結構-佇列、棧資料結構佇列
- 資料結構(筆試題-棧(入棧出棧)資料結構筆試
- 特殊資料結構:單調棧資料結構
- 重學資料結構(二、棧)資料結構
- 重學資料結構之棧資料結構
- JS 裡的資料結構 - 棧JS資料結構
- JS資料結構-棧-練習JS資料結構
- python資料結構之棧Python資料結構
- js實現資料結構--棧JS資料結構
- 資料結構-棧與佇列資料結構佇列
- 資料結構—棧和佇列資料結構佇列
- 資料結構(棧和佇列)資料結構佇列
- 【資料結構】--棧和佇列資料結構佇列
- 資料結構:棧與佇列資料結構佇列
- 資料結構學習筆記--棧資料結構筆記
- JavaScript 資料結構之隊棧互搏JavaScript資料結構
- 資料結構之php實現棧資料結構PHP