fixed Division思路:
1 把数组等分;
2 允许stack在其中增长;
stack0 [0,n/3)
stack1 [n/3,2n/3)
stack2 [2n/3,n)
class FixedMultiStack
{
int numberOfStacks = 3;
int stackCapacity;
//数组存储的内容;
int[] values;
//存储不同stack的size;比如:stack1, 9个元素;
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("stack"+ stackNum + " is full");
}
values[indexOfTop(stackNum)] = value;
//增加了size
sizes[stackNum]++;
}
/// <summary>
/// 返回并删除顶部的值
/// </summary>
/// <param name="stackNum"></param>
/// <returns></returns>
public int Pop(int stackNum)
{
if (isEmpty(stackNum))
throw new Exception("stackNum"+ stackNum+"is Empty");
int topIndex = indexOfTop(stackNum);//获取index
int value = values[topIndex];
values[topIndex] = 0;//清空
sizes[stackNum]--;//shrink
return value;
}
/// <summary>
/// 返回顶部值
/// </summary>
/// <param name="stackNum"></param>
/// <returns></returns>
public int Peek(int stackNum)
{
if (isEmpty(stackNum))
throw new Exception("stackNum" + stackNum + "is Empty");
int topIndex = indexOfTop(stackNum);//获取index
int value = values[topIndex];
return value;
}
/// <summary>
/// 检查stack是否为空
/// </summary>
/// <param name="stackNum"></param>
/// <returns></returns>
public bool isEmpty(int stackNum)
{
return sizes[stackNum] == 0;
}
/// <summary>
/// 检查stack是否为满
/// </summary>
/// <param name="stackNum"></param>
/// <returns></returns>
public bool isFull(int stackNum)
{
return sizes[stackNum] == stackCapacity;
}
/// <summary>
/// 返回stack顶部的index;注意:顶部最早push;stackNum:0,1,2
/// 举例:stackNum=0; stackCapacity=3; 现有2个元素; 应该返回:index=2;
/// </summary>
/// <param name="stackNum"></param>
/// <returns></returns>
public int indexOfTop(int stackNum)
{
int offset = stackNum * stackCapacity;
int size = sizes[stackNum];
return offset + size - 1;
}
}