- 栈释义
栈是一种线性数据结构,存储以及查找数据时只能访问栈的一端。类似于餐厅的盘子,新盘子放到这一叠盘子最上面,取的时候也是从最上面开始。最后放的盘子的也是最先被取走的那个。因此栈称为后进先出(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