C#算法從入門到跑路 第1章:線性表之棧與隊列的互相表示

用兩個棧表示隊列

/// <summary>
/// 隊列
/// </summary>
namespace DataStruct.Queue
{
    /// <summary>
    /// 雙棧實現隊
    /// </summary>
    /// <typeparam name="T">數據類型</typeparam>
    class SQueue<T>:IQueue<T>
    {
        /// <summary>
        /// 元素個數
        /// </summary>
        private int count;
        /// <summary>
        /// 棧1
        /// </summary>
        private IStack<T> sk1;
        /// <summary>
        /// 棧2
        /// </summary>
        private IStack<T> sk2;
        /// <summary>
        /// 構造器
        /// </summary>
        public SQueue()
        {
            this.sk1 = new LinkStack<T>();
            this.sk2 = new LinkStack<T>();
        }
        /// <summary>
        /// 入隊
        /// </summary>
        /// <param name="val">入隊元素</param>
        public void Enter(T val)
        {
            this.sk1.Push(val);
            this.count++;
        }
        /// <summary>
        /// 出隊
        /// </summary>
        /// <returns>返回出隊元素</returns>
        public T Out()
        {
            if (IsEmpty())
                throw new IndexOutOfRangeException("棧空");
            this.count--;
            if (!sk2.IsEmpty())
                return sk2.Pop();
            else
            {
                while(!sk1.IsEmpty())
                {
                    sk2.Push(sk1.Pop());
                }
                return sk2.Pop();
            }
        }
        /// <summary>
        /// 隊列元素個數
        /// </summary>
        public int Count { get=>this.count; }
        /// <summary>
        /// 判斷隊列空
        /// </summary>
        /// <returns>返回是否空</returns>
        public bool IsEmpty() => this.sk1.IsEmpty() && this.sk2.IsEmpty();
        
        /// <summary>
        /// 清理隊列元素
        /// </summary>
        public void Clear()
        {
            this.sk1.Clear();
            this.sk2.Clear();
        }
    }
}

用兩個隊列表示棧

/// <summary>
/// 棧
/// </summary>
namespace DataStruct.Stack
{
    /// <summary>
    /// 隊列實現棧
    /// </summary>
    /// <typeparam name="T">數據類型</typeparam>
    class QStack<T> : IStack<T>
    {
        /// <summary>
        /// 元素個數
        /// </summary>
        private int count;
        /// <summary>
        /// 隊列1
        /// </summary>
        private IQueue<T> q1;
        /// <summary>
        /// 隊列2
        /// </summary>
        private IQueue<T> q2;
        /// <summary>
        /// 構造器
        /// </summary>
        public QStack()
        {
            this.q1 = new LinkQueue<T>();
            this.q2 = new LinkQueue<T>();
        }
        /// <summary>
        /// 出棧
        /// </summary>
        /// <returns>返回出棧元素</returns>
        public T Pop()
        {
            if (IsEmpty())
                throw new IndexOutOfRangeException("棧空");
            this.count--;
            if (q1.IsEmpty())
            {
                while(q2.Count>1)
                    q1.Enter(q2.Out());
                return q2.Out();
            }
            else
            {
                while (q1.Count > 1)
                    q2.Enter(q1.Out());
                return q1.Out();
            }
        }
        /// <summary>
        /// 入棧
        /// </summary>
        /// <param name="val">入棧元素</param>
        public void Push(T val)
        {
            if(!q1.IsEmpty())
                q1.Enter(val);
            else
                q2.Enter(val);
            this.count++;
        }
        /// <summary>
        /// 棧內元素個數
        /// </summary>
        public int Count { get=>this.count; }
        /// <summary>
        /// 判斷棧空
        /// </summary>
        /// <returns>返回棧是否空</returns>
        public bool IsEmpty()=>q1.IsEmpty() && q2.IsEmpty();
        /// <summary>
        /// 清理棧內元素
        /// </summary>
        public void Clear()
        {
            q1.Clear();
            q2.Clear();
        }
    }
}
相關文章
相關標籤/搜索