- 棧釋義
棧是一種線性數據結構,存儲以及查找數據時只能訪問棧的一端。類似於餐廳的盤子,新盤子放到這一疊盤子最上面,取的時候也是從最上面開始。最後放的盤子的也是最先被取走的那個。因此棧稱爲後進先出(Last in First Out )。
下列演示了一系列的棧的操作:
- 棧中至少有一個元素的時候才能取出,否則應當給予空棧的提示。只有空間足夠的時候才能再添加一個元素,否則應當給予棧滿的提示。因些根據這些狀態對於棧而言通常操作包括:
- 棧空判斷
- 棧滿判斷
- 彈出棧頂元素
- 入棧操作
- 本例使用數組實現一個棧,代碼清單如下:
- 棧空判斷
-(BOOL) isEmpty{
return !self.array.count;
}
- 棧滿判斷
-(BOOL) isFull{
return self.array.count > self.size;
}
- 彈出棧頂元素且刪除棧頂元素
-(NSObject*) pop{
if(self.array){
NSObject* lastObj = self.array.lastObject;
[self.array removeLastObject];
return lastObj;
}
return nil;
}
- 入棧操作
-(void)push:(NSObject *)e{
if (self.array.count < self.size) {
[self.array addObject:e];
//NSLog(@"30------入棧元素:%@",e);
}else{
NSAssert([self isFull], @"棧滿,不能再入棧");
}
}
- 全部代碼如下:
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
/**
定義一個用作遍歷棧的輸出
*/
typedef void(^StackBlock)(id obj);
@interface Stack : NSObject
-(instancetype) initWithSize:(NSInteger)size;
-(void) push:(NSObject*) e;
-(NSObject*) pop;
-(BOOL) isFull;
-(BOOL) isEmpty;
-(NSInteger) count;
@end
NS_ASSUME_NONNULL_END
#import "Stack.h"
@interface Stack()
@property(nonatomic,strong) NSMutableArray* array;
@property(nonatomic,assign) NSInteger size;
@end
@implementation Stack
-(instancetype) initWithSize:(NSInteger)size{
self = [super init];
if (self) {
self.size = size;
self.array = [[NSMutableArray alloc] init];
}
return self;
}
-(void)push:(NSObject *)e{
if (self.array.count < self.size) {
[self.array addObject:e];
//NSLog(@"30------入棧元素:%@",e);
}else{
NSAssert([self isFull], @"棧滿,不能再入棧");
}
}
-(NSObject*) pop{
if(self.array){
NSObject* lastObj = self.array.lastObject;
[self.array removeLastObject];
return lastObj;
}
return nil;
}
-(BOOL) isEmpty{
return !self.array.count;
}
-(BOOL) isFull{
return self.array.count > self.size;
}
-(NSInteger)count{
return self.array.count;
}
@end