如何使用单个数组实现3个堆栈

时间:2015-02-15 00:57:02

标签: arrays stack typeid

问题:使用一个数组实现3个堆栈

我最近遇到了这个问题并经历了一些不同类型的解决方案。

以下是我见过的一些解决方案:

  1. 堆叠中的交错位置,如下所示: a1,b1,c1,a2,b2,c3 ......

    但是如果堆栈的大小变化很大,那么效率会很高,我们最终会浪费空间。

  2. 从数组的备用端开始2个堆栈,从数组的中间开始第3个堆栈并继续检查它们是否相互重叠

    这似乎是一个更好的解决方案,但是解决方案建议让第3个堆栈开始与堆栈1或堆栈2重叠,你改变堆栈3的方向。但是让我们说堆栈1和堆栈2都是相等的大小= 1.并且堆栈3开始超过堆栈2,它将改变方向,现在它将与堆栈1重叠。我们当然可以设置条件来检查这一点,但是在我的视图中再次复制和改变方向是太多的开销。

  3. 这是我想到的解决方案,但我不确定它是否是最有效的解决方案。也许最节省空间,但不是时间(效率)

    假设堆栈1,2和3的元素都是整数。

    1.我将在(双)数组中一个接一个地插入元素而没有任何逻辑。

    1. 插入时: 对于堆栈1保持整数, 对于堆栈2使其加倍, 对于堆栈3使其浮动。
    2. 当搜索/弹出时,我从位置1开始并检查类型值
  4. 代码:

    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
    }
    

    这不是最干净/最正确的代码,但我希望我的想法清楚。

1 个答案:

答案 0 :(得分:0)

您可以尝试一些兴趣变种。

F.e。您可以像固定大小的块(页面)一样组织堆栈。例如,每个块的大小可以是128或256个元素。每个块的第一个元素(让我们称之为header)包含0,如果块为空,或者1,2,3 - 堆栈的数量。如果需要性能,标题可以包含下一个和前一个块的索引。

这样的决定让你几乎可以使用所有内存,除了标题和最坏的两个元素块。但在实施中可能不那么明确。

当然,与整个堆栈的大小相比,块的大小必须足够小。