1.4.29 #
解答 #
和用两个栈实现队列的方法类似。
push 的时候把右侧栈内容倒到左侧栈,之后再入栈。
pop 的时候也做相同操作,右侧栈内容进左侧栈,之后再出栈。
enqueue 的时候则将左侧栈内容倒到右侧栈,之后再入队。
代码 #
internal class StackSteque<TItem>
{
private readonly Stack<TItem> _h;
private readonly Stack<TItem> _t;
/// <summary>
/// 初始化一个 Steque
/// </summary>
public StackSteque()
{
_h = new Stack<TItem>();
_t = new Stack<TItem>();
}
/// <summary>
/// 向栈中添加一个元素。
/// </summary>
/// <param name="item"></param>
public void Push(TItem item)
{
ReverseT();
_h.Push(item);
}
/// <summary>
/// 将 T 中的元素弹出并压入到 H 中。
/// </summary>
private void ReverseT()
{
while (!_t.IsEmpty())
{
_h.Push(_t.Pop());
}
}
/// <summary>
/// 将 H 中的元素弹出并压入到 T 中。
/// </summary>
private void ReverseH()
{
while (!_h.IsEmpty())
{
_t.Push(_h.Pop());
}
}
/// <summary>
/// 从 Steque 中弹出一个元素。
/// </summary>
/// <returns></returns>
public TItem Pop()
{
ReverseT();
return _h.Pop();
}
/// <summary>
/// 在 Steque 尾部添加一个元素。
/// </summary>
/// <param name="item"></param>
public void Enqueue(TItem item)
{
ReverseH();
_t.Push(item);
}
/// <summary>
/// 检查 Steque 是否为空。
/// </summary>
/// <returns></returns>
public bool IsEmpty()
{
return _h.IsEmpty() && _t.IsEmpty();
}
}