算法-链表实现栈

链表是一种递归的数据结构,它或者为空(null),或者只想一个节点(node)的引用,改节点包含了一个对象和执行另外一条链表的引用,节点可能是包含任意数据数据的抽象尸体,包含的只想节点的应用显示了它在链表之中的作用。相比数组来说有更多的灵活性, 本文就简单的用链表实现一下栈,栈的最大的特点就是后进先出,队列是先进先出,两者不太一样,本文将简单的用OC实现栈。

Node定义:

1
2
3
4
5
6
7
@interface  Node :  NSObject
 
@property   (strong, nonatomic )   NSString   *value;
 
@property   (strong, nonatomic )  Node  *next;
 
@end

 Stack头文件定义:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
@interface  Stack :  NSObject
//栈顶的元素
@property   (strong, nonatomic ) Node  *first;
 
@property   (assign, nonatomic NSInteger   count;
 
-( BOOL )isEmpty;
 
-( NSInteger )size;
 
-( void )push:( NSString  *)value;
 
-( NSString  *)pop;
 
-( void )remove:( NSString  *)value;
 
@end

其中有三个主要的实现方法,入栈(push),出栈(pop),删除(remove),需要注意的是本文中的删除是单向链表的删除,如果删除最后一个,时间复杂度和链表的长度有关系,我们可以采用双向链表,有兴趣的可以研究一下。

Stack.m的实现代码:

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
@implementation  Stack
 
-( BOOL )isEmpty{
     return  self .count==0;
}
 
-( NSInteger )size{
     return  self .count;
}
 
-( void )push:( NSString  *)value{
     Node  *oldFirst= self .first;
     self .first=[[Node alloc]init];
     self .first.value=value;
     self .first.next=oldFirst;
     self .count= self .count+1;
}
 
-( NSString  *)pop{
     if  (! self .first) {
         return  [ NSString  stringWithFormat:@ "-1" ];
     }
     NSString  *value= self .first.value;
     self .first= self .first.next;
     self .count= self .count-1;
     return  value;
}
 
-( void )remove:( NSString  *)value{
     if  ([ self .first.value isEqualToString:value]) {
         self .first= self .first.next;
         self .count= self .count-1;
     } else {
         Node *node= self .first;
         while  (node.next) {
             if  ([node.next.value isEqualToString:value]){
                 if  (node.next.next) {
                     Node *tempNode=node.next.next;
                     node.next=tempNode;
                 } else {
                     node.next= NULL ;
                 }
                 self .count= self .count-1;
                 break ;
             } else {
                 node=node.next;
             }
            
         }
     }
}
 
@end

 

测试代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
Stack  *stack=[[Stack alloc]init];
Node *first=[[Node alloc]init];
first.value=@ "iOS技术交流群:228407086" ;
first.next= NULL ;
stack.first=first;
[stack push:@ "FlyElephant" ];
[stack push:@ "博客园" ];
[stack push:@ "keso" ];
[stack remove:@ "FlyElephant" ];
NSLog (@ "出栈:%@" ,stack.pop);
NSLog (@ "出栈:%@" ,stack.pop);
NSLog (@ "出栈:%@" ,stack.pop);
NSLog (@ "出栈:%@" ,stack.pop);

效果如下:

本文转自Fly_Elephant博客园博客,原文链接:http://www.cnblogs.com/xiaofeixiang/p/4558408.html,如需转载请自行联系原作者

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值