C#indexOfTop(int stackNum)方法如何确定堆栈的顶部?

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

“indexOfTop(intstacknum)”方法如何准确地计算给定堆栈编号的顶部

资料来源:破解编码面试189编程问题与解决方案:第3章|堆栈和队列:3.1-描述如何使用单个数组实现三个堆栈

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
so
4


请注意,如果堆栈上没有pused元素,则索引实际上将引用上一个堆栈(或-1表示第一个堆栈)。因此,一个好的代码片段应该在这方面出错。

此实现将所有N个堆栈预先分配给容量。因此,每个堆栈在大数组中都有固定的偏移量


初始元素的偏移量计算为堆栈数(基于零)乘以固定堆栈容量。现在要查找顶部元素的索引,只需将堆栈上存储的元素数添加到初始元素的偏移量。

它维护一个
int[]size
数组,用于跟踪堆栈的大小。谢谢!你的解释很容易理解和理解。