CC150 3.1 Three in one: describe how you could use a single array to implement 3 stacks.

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;
        }

    }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值