用两个栈表示队列
/// <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();
}
}
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。