问题:使用一个数组实现3个堆栈
我最近遇到了这个问题并经历了一些不同类型的解决方案。
以下是我见过的一些解决方案:
堆叠中的交错位置,如下所示: a1,b1,c1,a2,b2,c3 ......
但是如果堆栈的大小变化很大,那么效率会很高,我们最终会浪费空间。
从数组的备用端开始2个堆栈,从数组的中间开始第3个堆栈并继续检查它们是否相互重叠
这似乎是一个更好的解决方案,但是解决方案建议让第3个堆栈开始与堆栈1或堆栈2重叠,你改变堆栈3的方向。但是让我们说堆栈1和堆栈2都是相等的大小= 1.并且堆栈3开始超过堆栈2,它将改变方向,现在它将与堆栈1重叠。我们当然可以设置条件来检查这一点,但是在我的视图中再次复制和改变方向是太多的开销。
这是我想到的解决方案,但我不确定它是否是最有效的解决方案。也许最节省空间,但不是时间(效率)
假设堆栈1,2和3的元素都是整数。
1.我将在(双)数组中一个接一个地插入元素而没有任何逻辑。
代码:
double arr[100];
int stackPointer[3]; // keep track of last insertion point for respective stacks
void insertion(stackNumber,value){
for(int i = 0; i<100; i++){
if(arr[i]=='\0'){
if (stackNumber==1) arr[i] = (int)value;
if (stackNumber==2) arr[i] = (double)value;
if (stackNumber==3) arr[i] = (float)value;
}
if (stackNumber==1) stackPointer[0] = i;
if (stackNumber==2) stackPointer[1] = i;
if (stackNumber==3) stackPointer[2] = i;
}
}
int popping(stackNumber){
for(int i = stackPointer[stackNumber]-1; i>=0 ; i-- ){
if( typeid(arr[i]).name() == typeid(arr[stackPointer[stackNumber]]).name() )
stackPointer[stackNumber] = i
}
arr[ stackPointer[stackNumber] ] = '\0'; // pop this element
}
这不是最干净/最正确的代码,但我希望我的想法清楚。
答案 0 :(得分:0)
您可以尝试一些兴趣变种。
F.e。您可以像固定大小的块(页面)一样组织堆栈。例如,每个块的大小可以是128或256个元素。每个块的第一个元素(让我们称之为header
)包含0,如果块为空,或者1,2,3 - 堆栈的数量。如果需要性能,标题可以包含下一个和前一个块的索引。
这样的决定让你几乎可以使用所有内存,除了标题和最坏的两个元素块。但在实施中可能不那么明确。
当然,与整个堆栈的大小相比,块的大小必须足够小。