1.3.44

1.3.44 #

解答 #

这里我们使用两个栈来模拟缓冲区。

向左/向右移动 = 从左/右栈弹出相应数量的元素并压入另外一个栈。

插入/删除 = 左栈压入/弹出一个元素。

字符数量 = 左栈数量 + 右栈数量。

代码 #

internal class Buffer
{
    private readonly Stack<char> _leftside;
    private readonly Stack<char> _rightside;

    /// <summary>
    /// 建立一个文本缓冲区。
    /// </summary>
    public Buffer()
    {
        _leftside = new Stack<char>();
        _rightside = new Stack<char>();
    }

    /// <summary>
    /// 在光标位置插入字符 c。
    /// </summary>
    /// <param name="c">要插入的字符。</param>
    public void Insert(char c)
    {
        _leftside.Push(c);
    }

    /// <summary>
    /// 删除并返回光标位置的字符。
    /// </summary>
    /// <returns></returns>
    public char Delete()
    {
        return _leftside.Pop();
    }

    /// <summary>
    /// 将光标向左移动 k 个位置。
    /// </summary>
    /// <param name="k">光标移动的距离。</param>
    public void Left(int k)
    {
        for (var i = 0; i < k; i++)
        {
            _rightside.Push(_leftside.Pop());
        }
    }

    /// <summary>
    /// 将光标向右移动 k 个位置。
    /// </summary>
    /// <param name="k">光标移动的距离。</param>
    public void Right(int k)
    {
        for (var i = 0; i < k; i++)
        {
            _leftside.Push(_rightside.Pop());
        }
    }

    /// <summary>
    /// 返回缓冲区中的字符数量。
    /// </summary>
    /// <returns></returns>
    public int Size()
    {
        return _leftside.Size() + _rightside.Size();
    }

    /// <summary>
    /// 将缓冲区的内容输出,这将使光标重置到最左端。
    /// </summary>
    /// <returns></returns>
    public string Getstring()
    {
        while (!_leftside.IsEmpty())
        {
            _rightside.Push(_leftside.Pop());
        }

        return _rightside.ToString();
    }
}

另请参阅 #

Generics 库