1.3.1

上次更新:2019-04-17
发现了题解错误/代码缺陷/排版问题?请点这里:如何:提交反馈

解答

首先是 FixedCapacityStackOfStrings 类,官方 JAVA 版本参考:FixedCapacityStackOfStrings.java

IsFull() 的实现比较简单,判断 N 与数组长度是否相等即可。

代码

using System;
using System.Collections;
using System.Collections.Generic;

namespace _1._3._1
{
    class FixedCapacityStackOfStrings : IEnumerable<string>
    {
        private string[] a;
        private int N;

        /// <summary>
        /// 默认构造函数。
        /// </summary>
        /// <param name="capacity">栈的大小。</param>
        public FixedCapacityStackOfStrings(int capacity)
        {
            this.a = new string[capacity];
            this.N = 0;
        }

        /// <summary>
        /// 检查栈是否为空。
        /// </summary>
        /// <returns></returns>
        public bool IsEmpty()
        {
            return this.N == 0;
        }

        /// <summary>
        /// 检查栈是否已满。
        /// </summary>
        /// <returns></returns>
        public bool IsFull()
        {
            return this.N == this.a.Length;
        }

        /// <summary>
        /// 将一个元素压入栈中。
        /// </summary>
        /// <param name="item">要压入栈中的元素。</param>
        public void Push(string item)
        {
            this.a[N] = item;
            this.N++;
        }

        /// <summary>
        /// 从栈中弹出一个元素,返回被弹出的元素。
        /// </summary>
        /// <returns></returns>
        public string Pop()
        {
            this.N--;
            return this.a[N];
        }

        /// <summary>
        /// 返回栈顶元素(但不弹出它)。
        /// </summary>
        /// <returns></returns>
        public string Peek()
        {
            return this.a[N - 1];
        }

        public IEnumerator<string> GetEnumerator()
        {
            return new ReverseEnmerator(this.a);
        }

        IEnumerator IEnumerable.GetEnumerator()
        {
            return GetEnumerator();
        }

        private class ReverseEnmerator : IEnumerator<string>
        {
            private int current;
            private string[] a;

            public ReverseEnmerator(string[] a)
            {
                this.current = a.Length;
                this.a = a;
            }

            string IEnumerator<string>.Current => a[current];

            object IEnumerator.Current => a[current];

            void IDisposable.Dispose()
            {
                this.current = -1;
                this.a = null;
            }

            bool IEnumerator.MoveNext()
            {
                if (this.current == 0)
                    return false;
                this.current--;
                return true;
            }

            void IEnumerator.Reset()
            {
                this.current = a.Length;
            }
        }
    }
}
上一题 下一题