数据结构&算法-共享栈

概念

共享栈:两个栈共享同一片存储空间,这片存储空间不单独属于任何一个栈,某个栈需要的多一点,它就可能得到更多的存储空间;
两个栈的栈底在这片存储空间的两端,当元素入栈时,两个栈的栈顶指针相向而行。

图示

在这里插入图片描述

在这里插入图片描述

运行结果

在这里插入图片描述

代码

using System;

namespace SharingStack
{
    class Program
    {
        static void Main(string[] args)
        {
            SharingStackC<string> sharingStackC = new SharingStackC<string>(5);
          
            sharingStackC.Push("龙", 1);
            sharingStackC.Push("猴", 2);
            Console.WriteLine(sharingStackC.Pop(1));
            Console.WriteLine(sharingStackC.Pop(2));
            Console.WriteLine("-----------------------------");

            sharingStackC.Push("蛇", 1);
            sharingStackC.Push("马", 1);
            sharingStackC.Push("羊", 1);
            sharingStackC.Push("虎", 1);
            sharingStackC.Push("兔", 1);
            sharingStackC.Push("牛", 1);
            Console.WriteLine("-----------------------------");

            while (sharingStackC.Stack1Count > 0)
            {
                Console.WriteLine(sharingStackC.Pop(1));
            }
            sharingStackC.Push("牛", 2);
            sharingStackC.Push("鼠", 2);
            sharingStackC.Push("白", 2);
            Console.WriteLine("-----------------------------");

            while (sharingStackC.Stack2Count > 0)
            {
                Console.WriteLine(sharingStackC.Pop(2));
            }
        }
    }

    /// <summary>
    /// 共享栈
    /// </summary>
    /// <typeparam name="DataT"></typeparam>
    class SharingStackC<DataT>
    {

        DataT[] totalCapacoty;
        int stack1Top;
        int stack2Top;

        /// <summary>
        /// 一号栈数量
        /// </summary>
        public int Stack1Count
        {
            get { return stack1Top + 1; }
        }
        /// <summary>
        /// 二号栈数量
        /// </summary>
        public int Stack2Count
        {
            get { return totalCapacoty.Length - stack2Top; }
        }

        /// <summary>
        /// 空间大小
        /// </summary>
        /// <param name="count"></param>
        public SharingStackC(int count)
        {
            if (count < 1)
            {
                throw new Exception("空间大小要大于0");
            }

            totalCapacoty = new DataT[count];
            stack1Top = -1;
            stack2Top = totalCapacoty.Length;
        }

        /// <summary>
        /// 入栈
        /// </summary>
        /// <param name="data"></param>
        /// <param name="stackNumber"></param>
        public void Push(DataT data, int stackNumber)
        {
            if (stack1Top + 1 == stack2Top)
            {
                Console.WriteLine("空间已满,{0} 无法入栈", data);
                return;
            }
            if (stackNumber == 1)
            {
                stack1Top++;
                totalCapacoty[stack1Top] = data;
            }
            else if (stackNumber == 2)
            {
                stack2Top--;
                totalCapacoty[stack2Top] = data;

            }
        }

        /// <summary>
        /// 取数据
        /// </summary>
        /// <param name="stackNumber"></param>
        /// <returns></returns>
        public DataT Peek(int stackNumber)
        {

            if (stackNumber == 1 && stack1Top > -1)
            {
                return totalCapacoty[stack1Top];
            }
            else if (stackNumber == 2 && stack2Top < totalCapacoty.Length)
            {
                return totalCapacoty[stack2Top];
            }

            return default(DataT);
        }
        /// <summary>
        /// 出栈
        /// </summary>
        /// <param name="stackNumber"></param>
        /// <returns></returns>
        public DataT Pop(int stackNumber)
        {
            if (stackNumber == 1 && stack1Top > -1)
            {
                DataT temp = totalCapacoty[stack1Top];
                stack1Top--;
                return temp;
            }
            else if (stackNumber == 2 && stack2Top < totalCapacoty.Length)
            {
                DataT temp = totalCapacoty[stack2Top];
                stack2Top++;
                return temp;
            }
            return default(DataT);
        }
    }
}

参考

一文搞懂共享栈

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值