C#算法从入门到跑路 第1章:线性表之栈与队列的互相表示

用两个栈表示队列

/// 
/// 队列
/// 
namespace DataStruct.Queue
{
    /// 
    /// 双栈实现队
    /// 
    /// 数据类型
    class SQueue:IQueue
    {
        /// 
        /// 元素个数
        /// 
        private int count;
        /// 
        /// 栈1
        /// 
        private IStack sk1;
        /// 
        /// 栈2
        /// 
        private IStack sk2;
        /// 
        /// 构造器
        /// 
        public SQueue()
        {
            this.sk1 = new LinkStack();
            this.sk2 = new LinkStack();
        }
        /// 
        /// 入队
        /// 
        /// 入队元素
        public void Enter(T val)
        {
            this.sk1.Push(val);
            this.count++;
        }
        /// 
        /// 出队
        /// 
        /// 返回出队元素
        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();
            }
        }
        /// 
        /// 队列元素个数
        /// 
        public int Count { get=>this.count; }
        /// 
        /// 判断队列空
        /// 
        /// 返回是否空
        public bool IsEmpty() => this.sk1.IsEmpty() && this.sk2.IsEmpty();
        
        /// 
        /// 清理队列元素
        /// 
        public void Clear()
        {
            this.sk1.Clear();
            this.sk2.Clear();
        }
    }
}

用两个队列表示栈

/// 
/// 栈
/// 
namespace DataStruct.Stack
{
    /// 
    /// 队列实现栈
    /// 
    /// 数据类型
    class QStack : IStack
    {
        /// 
        /// 元素个数
        /// 
        private int count;
        /// 
        /// 队列1
        /// 
        private IQueue q1;
        /// 
        /// 队列2
        /// 
        private IQueue q2;
        /// 
        /// 构造器
        /// 
        public QStack()
        {
            this.q1 = new LinkQueue();
            this.q2 = new LinkQueue();
        }
        /// 
        /// 出栈
        /// 
        /// 返回出栈元素
        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();
            }
        }
        /// 
        /// 入栈
        /// 
        /// 入栈元素
        public void Push(T val)
        {
            if(!q1.IsEmpty())
                q1.Enter(val);
            else
                q2.Enter(val);
            this.count++;
        }
        /// 
        /// 栈内元素个数
        /// 
        public int Count { get=>this.count; }
        /// 
        /// 判断栈空
        /// 
        /// 返回栈是否空
        public bool IsEmpty()=>q1.IsEmpty() && q2.IsEmpty();
        /// 
        /// 清理栈内元素
        /// 
        public void Clear()
        {
            q1.Clear();
            q2.Clear();
        }
    }
}

你可能感兴趣的:(算法-数据结构,c#)