C#indexOfTop(int stackNum)方法如何确定堆栈的顶部?
“indexOfTop(intstacknum)”方法如何准确地计算给定堆栈编号的顶部 资料来源:破解编码面试189编程问题与解决方案:第3章|堆栈和队列:3.1-描述如何使用单个数组实现三个堆栈C#indexOfTop(int stackNum)方法如何确定堆栈的顶部?,c#,stack,C#,Stack,“indexOfTop(intstacknum)”方法如何准确地计算给定堆栈编号的顶部 资料来源:破解编码面试189编程问题与解决方案:第3章|堆栈和队列:3.1-描述如何使用单个数组实现三个堆栈 class FixedMultiStack { private int numberOfStacks = 3; private int stackCapacity; private int[] values; private int[] sizes; publ
class FixedMultiStack
{
private int numberOfStacks = 3;
private int stackCapacity;
private int[] values;
private int[] sizes;
public FixedMultiStack(int stackSize)
{
stackCapacity = stackSize;
values = new int[stackSize * numberOfStacks];
sizes = new int[numberOfStacks];
}
public void push(int stackNum, int value)
{
if (isFull(stackNum)) throw new Exception("Full stack, cannot push.");
/* Increment stack pionter and then update top value. */
sizes[stackNum]++;
values[indexOfTop(stackNum)] = value;
}
public int pop(int stackNum)
{
if (isEmpty(stackNum)) throw new Exception("Empty Stack, nothing to pop.");
int topIndex = indexOfTop(stackNum);
int value = values[topIndex]; //Get Top.
values[topIndex] = 0; //Clear
sizes[stackNum]--; //Shrink
return value;
}
/* Return top element. */
public int peek(int stackNum)
{
if (isEmpty(stackNum)) throw new Exception("Empty Stack, nothing to peek at.");
return values[indexOfTop(stackNum)];
}
public bool isFull(int stackNum)
{
return sizes[stackNum] == stackCapacity;
}
public bool isEmpty(int stackNum)
{
return sizes[stackNum] == 0;
}
/* Returns index of the top of the stack. */
private int indexOfTop(int stackNum)
{
int offset = stackNum * stackCapacity;
int size = sizes[stackNum];
return offset + size - 1;
}*
}
在代码片段的顶部,我们读到:
private int[] sizes;
这是一个数组,对于三个堆栈中的每一个,它跟踪该堆栈的元素数量。如果我们推动某个堆栈,则大小[stackNum]
会增加
现在,堆栈的布局为:
+-+-+-+-+-+-+-+-+-+-+-+-+
|A|A|a|a|B|b|b|b|C|C|C|c|
+-+-+-+-+-+-+-+-+-+-+-+-+
使用a
为第一个堆栈保留的位置,b
为第二个堆栈保留的位置,c
为第三个堆栈保留的位置。我们知道堆栈stackNum
从stackNum*stackCapacity
开始(请注意,对于第一个堆栈stackNum
从0
开始)。因此,通过添加占用的位置数,我们可以获得堆栈顶部的索引
在本例中,我使用大写字母A
/B
/C
表示占用的位置。所以这里的大小将是{2,1,3}
。如果我们这样查询栈顶b
,我们会询问indexOfTop(1)
。现在,由于每个堆栈(在我们的示例中)使用四个空格,因此我们的偏移量位于4*1==4
。由于堆栈上有一个元素,因此偏移量为4*1+1-1
so4
请注意,如果堆栈上没有pused元素,则索引实际上将引用上一个堆栈(或-1表示第一个堆栈)。因此,一个好的代码片段应该在这方面出错。此实现将所有N个堆栈预先分配给容量。因此,每个堆栈在大数组中都有固定的偏移量
初始元素的偏移量计算为堆栈数(基于零)乘以固定堆栈容量。现在要查找顶部元素的索引,只需将堆栈上存储的元素数添加到初始元素的偏移量。它维护一个int[]size
数组,用于跟踪堆栈的大小。谢谢!你的解释很容易理解和理解。