private void ImprimirItem(ItemLista <T> item, bool imprimirProximo = false)
        {
            Console.WriteLine($"Item fila impresso: {item.Dado}");

            if (item.Proximo != null && imprimirProximo)
            {
                ImprimirItem(item.Proximo, imprimirProximo);
            }
        }
        private void ImprimirItem(ItemLista <T> item, bool recursivo = false)
        {
            Console.WriteLine($"Item pilha impresso: {item.Dado}");

            if (item.Proximo != null && recursivo)
            {
                ImprimirItem(item.Proximo, recursivo);
            }
        }
        private void Processar(ItemLista <T> item, bool recursivo = false)
        {
            Console.WriteLine($"Item pilha processado: {item.Dado}");

            Ultimo = item.Proximo;

            if (!IsEmpty() && recursivo)
            {
                Processar(Ultimo, recursivo);
            }
        }
        public Tuple <bool, T> Pop()
        {
            if (!IsEmpty())
            {
                ItemLista <T> Saida = Ultimo;
                Ultimo = Ultimo.Proximo;
                return(Tuple.Create <bool, T>(true, Saida.Dado));
            }

            return(Tuple.Create <bool, T>(false, default(T)));
        }
        public void Push(T dado)
        {
            var item = new ItemLista <T>(dado);

            if (IsEmpty())
            {
                this.Ultimo = item;
            }
            else
            {
                item.Proximo = this.Ultimo;
                this.Ultimo  = item;
            }
        }
        private void Processar(ItemLista <T> item, bool processarProximo = false)
        {
            Console.WriteLine($"Item fila processado: {item.Dado}");

            Primeiro = item.Proximo;

            if (object.ReferenceEquals(item, Ultimo))
            {
                Ultimo = null;
            }

            if (IsEmpty() && processarProximo)
            {
                Processar(Primeiro, processarProximo);
            }
        }
        public Tuple <bool, T> DeQueue()
        {
            if (!IsEmpty())
            {
                ItemLista <T> Saida = Primeiro;
                Primeiro = Primeiro.Proximo;

                if (object.ReferenceEquals(Saida, Ultimo))
                {
                    Ultimo = null;
                }

                return(Tuple.Create <bool, T>(true, Saida.Dado));
            }

            return(Tuple.Create <bool, T>(false, default(T)));
        }
        public void EnQueue(T dado)
        {
            var item = new ItemLista <T>(dado);

            if (this.Primeiro is null)
            {
                this.Primeiro = item;
            }
            else if (this.Ultimo is null)
            {
                this.Ultimo           = item;
                this.Primeiro.Proximo = this.Ultimo;
            }
            else
            {
                this.Ultimo.Proximo = item;
                this.Ultimo         = item;
            }
        }