用兩個棧表示隊列
/// <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();
}
}
}