どうも。
ずいぶんとご無沙汰しました…。
ごぶさたした理由はいろいろありますが、
書くと長いのでw
で、
今回のお題は、
StackとQueueについて。
Javaには、
java.util.Stackとかjava.util.Queueとかあって、
普通に使えるワケですが、
Objective-Cにはそんなのない…。
StackやQueueというのはデータ構造であって、
その仕組みが分かっていれば、
NSMutableArrayに対して、
相応の処理をしてやればいいだけ。
とは言え、
popとかpushと書いて、
イメージ通りに動く方が見た目にもスッキリなので、
予め実装しておく。
NSMutableArrayを使うのであれば、
カテゴリにしてしまうのが楽ですね☆
カテゴリ名は、
VirtualStack, VirtualQueueとでもしておきます。
Virtualなんてつけるほどすごいことでもないけどw
[NSMutableArray+VirtualStack.m]
#import "NSMutableArray+VirtualStack.h"
@implementation NSMutableArray (VirtualStack)
- (id)pop {
id lastObj = [self lastObject];
if (lastObj != nil) {
[self removeLastObject];
}
return lastObj;
}
- (void)push:(id)obj {
[self addObject:obj];
}
@end
@implementation NSMutableArray (VirtualStack)
- (id)pop {
id lastObj = [self lastObject];
if (lastObj != nil) {
[self removeLastObject];
}
return lastObj;
}
- (void)push:(id)obj {
[self addObject:obj];
}
@end
[NSMutableArray+VirtualQueue.m]
#import "NSMutableArray+VirtualQueue.h"
@implementation NSMutableArray (VirtualQueue)
- (id)dequeue {
id headObj = [self objectAtIndex:0];
if (headObj != nil) {
[self removeObjectAtIndex:0];
}
return headObj;
}
- (void)enqueue:(id)obj {
[self addObject:obj];
}
@end
@implementation NSMutableArray (VirtualQueue)
- (id)dequeue {
id headObj = [self objectAtIndex:0];
if (headObj != nil) {
[self removeObjectAtIndex:0];
}
return headObj;
}
- (void)enqueue:(id)obj {
[self addObject:obj];
}
@end
と、
ここまで書いておいて…。
これって、
StackもQueueも両方あったら、
Stackとしてpush-popしてきたものに対して、
いきなりdequeueとか出来ちゃったりするw
それぞれ、
NSMutableArrayをメンバーに持つ、
別なクラスに切り出した方がいいのかもしれない。
複数人開発や、
マルチスレッドでのアクセスがありうるとか、
そういうリスク管理の観点では、
クラスとしてきちんと区別した方がいい。
あくまで、
簡易的に実現するなら、
という方法ですね、これは。
それでは。
ちゃお☆
まこぴー。