注意这里是整数,浮点数需要额外的操作,实现大整数的加减,三个栈就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,如需转载请自行联系原作者