CCI_Q3.3

本文参考该作者文章当作编程笔记:

作者:Hawstein
出处:http://hawstein.com/posts/ctci-solutions-contents.html

Q:

栈就像叠盘子,当盘子叠得太高时,就会倾斜倒下。因此,在真实的世界中,当一叠盘子 (栈)超过了一定的高度时,我们就会另起一堆,再从头叠起。实现数据结构SetOfStacks 来模拟这种情况。SetOfStacks由几个栈组成,当前一栈超出容量时,需要创建一个新的栈 来存放数据。SetOfStacks.push()和SetOfStacks.pop()的行为应当和只有一个栈时 表现的一样。

进一步地,

实现函数popAt(int index)在指定的子栈上进行pop操作。

思路:

我感觉和在一个数组实现3个栈是一样的(不然是我没看懂题。)。那就简单了,实现一个数组,需要3个top索引(p_cur[])来记录3个栈的数据情况。

popAt()函数没实现。

CODE:

实现:stack.c:

 1 #include<stdlib.h>
 2 #include"stack.h"
 3 int C;
 4 Item *stack;
 5 void STACKinit(int n)
 6 {
 7     stack=malloc(sizeof(int)*n);
 8     C=0;
 9 }
10 int STACKempty()
11 {
12     return C==0;
13 }
14 void STACKpush(Item i)
15 {
16     stack[C++]=i;
17 }
18 Item STACKpop()
19 {
20     return stack[--C];
21 }
22 Item STACKtop()
23 {
24     return stack[C-1];
25 }
26 int STACKfull(int n)
27 {
28     if(C==0)
29         return 0;
30     else if(C%n==0)
31         return 1;
32     else
33         return 0;
34 }

客户:

 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 #include<stdarg.h>
 4 #include<memory.h>
 5 #define N 10                        /*一个栈的长度*/
 6 #define M 3    /*3个栈*/                           
 7 int p_cur[M],p_cur_i=0;/*3个栈的top索引*/
 8 void stackInit()
 9 {
10     STACKinit(N*M);
11     memset(p_cur,0,sizeof(int)*M);
12 }
13 void stackPush(int i)
14 {
15     if(p_cur[M-1]==N)/*第3个栈已经到顶部*/
16         return;
17     if(STACKfull(N)==1)/*如果一个栈已满,到下一个栈*/
18     {
19         ++p_cur[++p_cur_i];
20         STACKpush(i);
21     }
22     else
23     {
24         ++p_cur[p_cur_i];
25         STACKpush(i);
26     }
27 }
28 int stackPop()
29 {
30     if(STACKempty())/*数组为空*/
31         return;
32     if(p_cur[p_cur_i]==0)/*到达一个栈的底部,回到前一个栈*/
33     {
34         --p_cur[--p_cur_i];
35     }
36     else
37     {
38         --p_cur[p_cur_i];
39     }
40     return STACKpop();
41 }
42 int main()
43 {
44     stackInit();
45     int i;
46     for(i=0;i<N+3;i++)
47     {
48         stackPush(i);
49         printf("%d %d\t",p_cur_i,p_cur[p_cur_i]);
50     }
51     printf("\n");
52     for(i=N+2;i>0;i--)
53     {
54         printf("%d:",stackPop());
55         printf("%d %d\t",p_cur_i,p_cur[p_cur_i]);
56     }
57     printf("\n");
58     return 0;
59 }

 

posted @ 2014-03-13 09:22  哈士奇.银桑  阅读(124)  评论(0编辑  收藏  举报