注意这里是整数,浮点数需要额外的操作,实现大整数的加减,三个栈就OK了,两个运算整数栈,一个结果栈,基本的逻辑的就是利用栈的先入后出的特点将高位push到栈底,低位push到栈顶,之后两个栈pop出来之后push到结果栈,结果栈pop出来就是我们想要的结果。
Stack.h:
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 |
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 |
进入重点了,整数的加减在StackSum.h中实现:
1
2
3
4
5
|
@interface StackSum : NSObject
-( NSInteger )sum:( NSInteger )firstNumber secondNumber:( NSInteger )secondNumber;
@end |
StackSum.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
|
@implementation StackSum
//原文地址:http://www.cnblogs.com/xiaofeixiang -( NSInteger )sum:( NSInteger )firstNumber secondNumber:( NSInteger )secondNumber{
//第一个整数的栈
Stack *firstStack=[ self getStackByNumber:firstNumber];
//第二个整数的栈
Stack *secondStack=[ self getStackByNumber:secondNumber];
//结果栈
Stack *resultStack=[[Stack alloc]init];
NSInteger flag=0; //进位标记
while (firstStack.count>0&&secondStack.count>0) {
NSInteger temp=[firstStack.pop integerValue]+[secondStack.pop integerValue]+flag;
[resultStack push:[ NSString stringWithFormat:@ "%ld" ,temp%10]];
flag=temp/10;
}
//第一个数字大于第二字数字的情况
while (firstStack.count>0) {
NSInteger temp=[firstStack.pop integerValue]+flag;
[resultStack push:[ NSString stringWithFormat:@ "%ld" ,temp%10]];
flag=temp/10;
}
//第二个数字大于第一个数字
while (secondStack.count>0) {
NSInteger temp=[secondStack.pop integerValue]+flag;
[resultStack push:[ NSString stringWithFormat:@ "%ld" ,temp%10]];
flag=temp/10;
}
//标记位有进位
if (flag) {
[resultStack push:[ NSString stringWithFormat:@ "%ld" ,flag]];
}
NSInteger count=resultStack.count;
NSString *str=@ "" ;
//正序输出即为结果
for ( NSInteger i=0; i<count; i++) {
str=[str stringByAppendingString:resultStack.pop];
}
return [str integerValue];
} -(Stack *)getStackByNumber:( NSInteger )value{
Stack *stack=[[Stack alloc]init];
NSString *stringValue=[ NSString stringWithFormat:@ "%ld" ,value];
for ( NSInteger i=0; i<[stringValue length]; i++) {
[stack push:[ NSString stringWithFormat:@ "%@" ,[stringValue substringWithRange: NSMakeRange (i, 1)]]];
}
return stack;
} @end |
简单的测试:
1
2
3
|
StackSum *sum=[[StackSum alloc]init]; NSLog (@ "大整数相加的结果为:%ld" , [sum sum:9999999 secondNumber:888]);
NSLog (@ "iOS技术交流群:228407086" );
|
结果如下:
本文转自Fly_Elephant博客园博客,原文链接:http://www.cnblogs.com/xiaofeixiang/p/4569658.html,如需转载请自行联系原作者