数据结构&算法-共享栈

Posted 彩色墨水

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构&算法-共享栈相关的知识,希望对你有一定的参考价值。

概念

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

图示

在这里插入图片描述

在这里插入图片描述

运行结果

在这里插入图片描述

代码

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

参考

一文搞懂共享栈

以上是关于数据结构&算法-共享栈的主要内容,如果未能解决你的问题,请参考以下文章

数据结构&算法08-栈概念&源码

C 中的共享内存代码片段

栈练习之Example004-顺序栈 s0 和 s1 共享一个存储区 elem,设计共享栈关于入栈和出栈操作的算法

Java 数据结构 & 算法宁可累死自己, 也要卷死别人 5 栈

考研数据结构与算法栈和队列

共享栈