[ Foro de C# ]

Palindromo Pila C#

31-Mar-2016 03:28
Alexa Lascurain
3 Respuestas

Buenas noches:

Tengo una duda debo crear una aplicación de Consola en C# que sea capaz de verificar si una palabra o frase es un palindromo utilizando una pila que yo cree, el código de la pila es este.

Me podrían ayudar, no se como llenar la pila con letras, ¿utilizo char o string?

De antemano, Muchas gracias.

 
   class Stack
 
    {
        private int MAX_SIZE;
        private int[] elements;
        private int top;
 
        public Stack(int max_size)
        {
            MAX_SIZE = max_size;
            top = -1;
            elements = new int[MAX_SIZE];           
        }
 
        public void InitializeStack( )
        {
            top = -1;
        }
 
        public bool IsEmptyStack()
        {
            if(top == -1)
            {                
                return true;
            }
            else
            {
 
                return false;
            }
        }
 
        public bool IsFullStack()
        {
            if (top == MAX_SIZE-1)
            {              
                return true;
            }
            else
            {              
                return false;
            }
        }
 
        public int StackSize()
        {
            Console.Write(top+1);
            return top+1;
        }
 
        public void StackPush(int val)
        {
 
            if ( IsFullStack() == false)
            {
                top++;              
                elements[top] = val;               
            }
 
            else
            {
                Console.WriteLine("\nERROR Stack overflow");
            }
 
        }
 
        public int StackPop()
        {
            int element_extr;
 
            if (IsEmptyStack() == false)
            {
                element_extr = elements[top];
                top--;             
               return element_extr;
 
            }
            else
            {
                Console.WriteLine("\nERROR Stack underflow");
                return int.MinValue;                
            }
 
 
        }
 
        public int StackPeek()            
        {
                int vista;                     
            if (IsEmptyStack() == false)
            {
                vista = elements[top];
                return vista;
 
            }
            else
            {
                Console.WriteLine("\nERROR Stack underflow");
                return int.MinValue;
            }
        }
 
        public void PrintStack()
        {           
            int i;
            for (i = 0; i <= top; i++) 
            {
                Console.WriteLine( elements[i] + "");                
            }            
        }
}  
 


 


03-Apr-2016 23:48
Nacho Cabanes (+32)

Por partes:

- Ese es un ejemplo de uso de pila, pero para almacenar números enteros. Te sirve para entender la idea de cómo funciona una pila (si no lo conocías), pero no es exactamente lo que necesitas, aunque los cambios serían poco más que cambiar "int" por "char".

- A nivel de lógica, si vas a guardar las letras de la cadena, parece más natural usar una pila de "char". Eso no quita que también puedes emplear "string" si te lo piden o si te resulta más cómodo por algún motivo, pero entonces no obtendrás los datos con [ ] sino con .Substring.

- En C# tienes ya creada una clase Stack. ¿Debes construir tu propia pila o no sabías que existía?

- La pila es sólo parte de la solución. ¿Tienes claro cómo usar la pila para comprobar si es palíndromo?


04-Apr-2016 02:28
Alexa Lascurain

Buenas noches:

-Debo crear la propia pila, basandome en una frase o palabra y con ella introducirla en el arreglo que simula la pila.

-Lo que he razonado es que debo comparar la letra que entra StackPush() con la letra que salga StackPop() y si ambas son iguales a lo largo de todo el arreglo entonces la frase o palabra es un palindromo.

-Mi principal duda es en el llenado del arreglo he avanzado esto, pero lo que hace es imprimir la primera letra varias veces.

Anexo Código

 
namespace PruebasPalindromeBien
{
    class Program
    {
        static int MAX_SIZE = 10;
        static Stack s = new Stack(MAX_SIZE);
 
        static void Main(string[] args)
        {
            char val;
            int i;
 
            Console.Write("Introduzca la palabra o frase ... ");
            val = char.Parse(Console.ReadLine());
 
            for (i = 0; i < MAX_SIZE; i++)
            {
                s.StackPush(val);
                if (char.IsWhiteSpace(val))
                {
                    s.StackPop();
                }
            }
            s.PrintStack();
            Console.ReadLine();
 
 
        }
    }
 
    class Stack
 
    {
        private int MAX_SIZE;
        private char[] elements;
        private int top;
 
        public Stack(int max_size)
        {
            MAX_SIZE = max_size;
            top = -1;
            elements = new char[MAX_SIZE];
        }
 
        public void InitializeStack()
        {
            top = -1;
        }
 
        public bool IsEmptyStack()
        {
            if (top == -1)
            {
                return true;
            }
            else
            {
 
                return false;
            }
        }
 
        public bool IsFullStack()
        {
            if (top == MAX_SIZE - 1)
            {
                return true;
            }
            else
            {
                return false;
            }
        }
 
        public int StackSize()
        {
            Console.Write(top + 1);
            return top + 1;
        }
 
        public void StackPush(char val)
        {
 
            if (IsFullStack() == false)
            {
                top++;
                elements[top] = val;
            }
 
            else
            {
                Console.WriteLine("\nERROR Stack overflow");
            }
 
        }
 
        public char StackPop()
        {
            char element_extr;
 
            if (IsEmptyStack() == false)
            {
                element_extr = elements[top];
                top--;
                return element_extr;
 
            }
            else
            {
                Console.WriteLine("\nERROR Stack underflow");
                return char.MinValue;
            }
        }
 
        public char StackPeek()
        {
            char vista;
            if (IsEmptyStack() == false)
            {
                vista = elements[top];
                return vista;
 
            }
            else
            {
                Console.WriteLine("\nERROR Stack underflow");
                return char.MinValue;
            }
        }
 
        public void PrintStack()
        {
            int i;
            for (i = 0; i <= top; i++)
            {
                Console.Write(elements[i] + "");
            }
        }
    }
}
 


 


04-Apr-2016 22:58
Nacho Cabanes (+32)

La clase Stack ya tiene muy buena apariencia, pero el Main aún no.

Por una parte, estás pidiendo un único carácter, que apilas varias veces, en vez de pedir una cadena y apilar las letras que la forman.

Por otra parte, hay varias formas de comprobar si una cadena es un palídromo usando una pila. Una de las formas más sencillas es volcar cada una de las letras que la forman y después desapilarlas una a una comparando con la letra que está en la correspondiente posición de la cadena original. Si alguna letra es diferente, la cadena no era un palíndromo. A partir de ahí, se puede mejorar por ejemplo comparando sólo la mitad de la longitud, sin llegar a desapilar toda la cadena, pero no creo que sea necesario que afines tanto.






(No se puede continuar esta discusión porque tiene más de dos meses de antigüedad. Si tienes dudas parecidas, abre un nuevo hilo.)