用两个栈表示队列

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

csharper
1 声望3 粉丝

曲终过尽松陵路,回首烟波十四桥。