转载请注明出处:
题目:
Imagine a (literal) stack of plates. If the stack gets too high, it might topple. Therefore, in real life, we would likely start a new stack when the previous stack exceeds some threshold. Implement a data structure SetOfStacks that mimics this. SetOfStacks should be composed of several stacks, and should create a new stack once the previous one exceeds capacity. SetOfStacks.push() and SetOfStacks.pop() should behave identically to a single stack (that is, pop() should return the same values as it would if there were just a single stack).
FOLLOW UP
Implement a function popAt(int index) which performs a pop operation on a specific sub-stack.
翻译:
想象一个由盘子叠起的栈,当栈叠得太高时,就可能倒下。因此,在现实生活中,当一个栈超过了一定的高度时,我们就会另起一个栈。实现数据结构SetOfStacks 来模拟这种情况。SetOfStacks由几个栈组成,当前一栈超出容量时,需要创建一个新的栈 来存放数据。SetOfStacks.push()和SetOfStacks.pop()的行为应当和只有一个栈时 表现的一样。
进一步地,
实现函数popAt(int index)在指定的子栈上进行pop操作。
思路:
其实跟上一题有一定的相似性,只是上一题使用一个数组来实现三个栈,我们这里要用多个数组实现多个栈,而后将它们联系在一起,这样我们就需要一个变量cur指向进行出入栈操作的当前数组,而对于栈顶指针top,如果当前数组已满,执行push操作,这时候cur++,而top重新置为-1(根据程序设置,有些程序设置为0),而如果当前数组为空,执行pop操作,这时候cur--,而top重新置为MAX-1(数组的顶部)。这样我们可以用个哈希数组来保存指向每个数组的指针。同样,如果要进行popAt操作,直接使用哈希数组的下标索引即可。
实现代码:
这里与上一题策略不同,我们直接将cur和top两个变量设为了全局变量,上一题用的引用传递参数
#define M 5 #define MAX 3 typedef int ElemType; typedef struct HashNode { int *Arr; }HashNode,*pHashTable; int top = -1; //全局变量,记录栈顶 int cur = 0; //全局变量,记录当前所用的数组的序号 #include<stdio.h> #include<stdlib.h> pHashTable create_HashTable() { //使用calloc直接将内部的每个Arr初始化为NULL pHashTable hashtable = (pHashTable)calloc(M,sizeof(HashNode)); if(!hashtable) { printf("malloc failed"); exit(-1); } return hashtable; } void push(pHashTable hashtable,ElemType data) { if(cur==0 && top==-1) { //内部元素全部初始化为0 hashtable[cur].Arr = (int *)calloc(MAX,sizeof(int)); if(!hashtable[cur].Arr) { printf("malloc failed"); exit(-1); } } if(cur>M-1) return; if(top<MAX-1) hashtable[cur].Arr[++top] = data; else if(top>MAX-1) return; else { //如果当前数组已经满了,则转到下一个数组进行push操作 cur++; top = -1; hashtable[cur].Arr = (int *)calloc(MAX,sizeof(int)); if(!hashtable[cur].Arr) { printf("malloc failed"); exit(-1); } push(hashtable,data); } } void pop(pHashTable hashtable) { if(cur>M-1 || cur<0) return; if(top>-1) hashtable[cur].Arr[top--] = 0; //将pop的元素置为0,即还原到默认初值值 else if(top<-1) return; else { //如果当前数组为空了,则释放掉给数组空间,转到上一个数组进行pop操作 free(hashtable[cur].Arr); hashtable[cur].Arr = NULL; cur--; top = MAX-1; pop(hashtable); } } int main() { pHashTable hashtable = create_HashTable(); push(hashtable,1); push(hashtable,2); push(hashtable,3); push(hashtable,4); push(hashtable,5); push(hashtable,6); push(hashtable,7); int i,j; printf("After pushed:\n"); for(i=0;i<M;i++) { if(hashtable[i].Arr) { for(j=0;j<MAX;j++) printf("%d ",hashtable[i].Arr[j]); printf("\n"); } } pop(hashtable); pop(hashtable); pop(hashtable); pop(hashtable); pop(hashtable); printf("After poped:\n"); for(i=0;i<M;i++) { if(hashtable[i].Arr) { for(j=0;j<MAX;j++) printf("%d ",hashtable[i].Arr[j]); printf("\n"); } } return 0; }测试结果:
【CareerCup】Stacks and Queues—Q3.3,布布扣,bubuko.com
【CareerCup】Stacks and Queues—Q3.3
原文:http://blog.csdn.net/ns_code/article/details/22493621