【CareerCup】Stacks and Queues—Q3.3

来源:互联网 发布:yap—yum示意图 编辑:程序博客网 时间:2024/05/29 08:49

转载请注明出处:http://blog.csdn.net/ns_code/article/details/22493621


    题目:

    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 3typedef 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初始化为NULLpHashTable 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){//内部元素全部初始化为0hashtable[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;}
    测试结果:

    注:代码开源到Github:https://github.com/mmc-maodun/CareerCup



3 0
原创粉丝点击