本文参考该作者文章当作编程笔记: 作者: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 ",p_cur_i,p_cur[p_cur_i]); 50 } 51 printf(" "); 52 for(i=N+2;i>0;i--) 53 { 54 printf("%d:",stackPop()); 55 printf("%d %d ",p_cur_i,p_cur[p_cur_i]); 56 } 57 printf(" "); 58 return 0; 59 }