【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;}测试结果:
- 【CareerCup】Stacks and Queues—Q3.3
- 【CareerCup】Stacks and Queues—Q3.1
- 【CareerCup】Stacks and Queues—Q3.2
- 【CareerCup】Stacks and Queues—Q3.2
- 【CareerCup】Stacks and Queues—Q3.4
- 【CareerCup】Stacks and Queues—Q3.5
- CareerCup chapter 3 Stacks and Queues
- Chapter 3 | Stacks and Queues
- Chapter 3 Stacks and Queues - 3.1
- Chapter 3 Stacks and Queues - 3.2
- Chapter 3 Stacks and Queues - 3.3
- Chapter 3 Stacks and Queues - 3.4
- Chapter 3 Stacks and Queues - 3.5
- Chapter 3 Stacks and Queues - 3.6
- !!!Chapter 3 Lists, Stacks, and Queues
- [cc150]Chapter 3 | Stacks and Queues
- 1-3 Bags,Queues and Stacks
- week2——Stacks and Queues
- Python yield 使用浅析
- 给中国学生的第二封信:从优秀到卓越
- Ubuntu 10下裸装JDK 1.6
- UE4中的AI解析1
- Oracle Data Guard_ 备库以只读或读写方式打开访问
- 【CareerCup】Stacks and Queues—Q3.3
- 关于静态成员变量与方法的一个实例
- 一步步学习微软InfoPath2010和SP2010--第三章节--表单设计基础:处理InfoPath布局、控件和视图(9)--添加第二个视图到Flight Delay表单
- Android应用之Excel文件
- 微软100题-天天做-第26题
- 开启服务时:报socket failed :EACCES (Permission denied) 错误
- 第五周(项目三)——对象数组操作长方柱类。
- 如何学好软件开发
- C#递归遍历文件夹