Stack 栈的了解
stack是一种线性表,只能在一端进行操作。Stack有如下特性:
- 往栈中添加元素的操作,一般叫做push,入栈。
- 从栈中移除元素的操作,一般叫做pop,出站。(只能移除栈顶元素)
- 后进先出的原则。
Stack 根据栈的特性,可以实现的代码
因为根据栈的特性,我们可以给栈提供以下接口:
元素的数量
是否为空
入栈
出栈
获取栈顶的元素
代码的实现如下:
- 创建一个YZStack的类,声明上面的接口,如下:
@interface YZStack : NSObject
//添加一个数据
- (void)push:(id)value;
//弹出一个数据
- (id)pop;
//是否为空
- (BOOL)isEmpty;
//大小
- (NSInteger)size;
//清空
- (void)clear;
//获取顶部的元素
- (id)top;
@end
- 方法的实现如下:
@interface YZStack()
@property (nonatomic, strong) NSMutableArray *stackArray;
@end
@implementation YZStack
- (void)push:(id)value {
if (value != nil) {
[self.stackArray addObject:value];
}
}
- (id)pop {
if (self.isEmpty) {
return nil;
}
id value = self.stackArray.lastObject;
[self.stackArray removeLastObject];
return value;
}
- (BOOL)isEmpty {
if (self.stackArray.count == 0) {
return YES;
}
return NO;
}
- (NSInteger)size {
return self.stackArray.count;
}
- (void)clear {
[self.stackArray removeAllObjects];
}
- (id)top {
if (self.isEmpty) {
return nil;
}
return self.stackArray.lastObject;
}
#pragma mark - 懒加载
- (NSMutableArray *)stackArray {
if (!_stackArray) {
_stackArray = [NSMutableArray array];
}
return _stackArray;
}
@end
用Stack实现有效括号的算法题
- 题目如下:
- 根据Stack的结构来解决,代码如下:
#import "ViewController.h"
#import "YZStack.h"
@interface ViewController ()
@property (nonatomic, strong) YZStack *stack;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
self.stack = [[YZStack alloc] init];
NSString *str = @"({[]})";
NSString *str1 = @"]{[]})";
NSString *str2 = @"({[]})[]";
NSLog(@"str = %@, str1 = %@, str2 = %@", [self invalidDesripter:str], [self invalidDesripter:str1], [self invalidDesripter:str2]);
}
- (NSString *)invalidDesripter:(NSString *)descripter {
if (descripter.length == 0) {
return @"NO";
}
NSDictionary *despriterDic = @{@"(":@")",@"[":@"]", @"{":@"}"};
for (NSInteger i = 0 ; i < descripter.length; i++) {
NSString *subStr = [descripter substringWithRange:NSMakeRange(i, 1)];
if ([despriterDic.allKeys containsObject:subStr]) {
[self.stack push:despriterDic[subStr]];
}else {
NSString *value = self.stack.pop;
if ([value isEqualToString:subStr]) {
continue;
}else {
return @"NO";
}
}
}
return @"YES";
}
@end