[ Foro de C ]

Como implenetar una cola implementada sobre una lista doblemente ligada

29-May-2022 20:46
Invitado (Rickmends)
0 Respuestas

Como puedo implementar una cola implementada sobre una lista doblemente ligada donde se inserta al principio y se extrae al final.
El programa debe realizar la conversión de la cadena mediante una pila implementada en sobre una lista ligada donde la cima de la pila está al final de la lista ligada.
En el siguiente programa:
#include "Infija.h"

Pila crearPila(int size)        // Crea una pila vacía
{
Pila s;
if (size < MinPilaSize)
{
printf("El tamaño es muy pequeño!\n");
}
s = (Pila)malloc(sizeof(struct RegistroPila));
s->capacidad = size;
s->TopOfPila = vacio;
s->array = (char*)malloc(sizeof(char) * size);

return s;
}

int Esvacia(Pila s)
{
return s->TopOfPila == vacio;
}

int EstaLlena(Pila s)
{
return s->TopOfPila == s->capacidad - 1;
}

void Push(Pila s, char c)        // Empuja la pila
{
if (EstaLlena(s))
{
printf("Error: La Pila esta llena!");
return;
}
else
{
s->array[++(s->TopOfPila)] = c;
}
}

char Top(Pila s)      // Regresa al elemento superior de la pila sin hacer estallar
{
if (Esvacia(s))
{
printf("Error: La Pila esta vacia!");
}
else
return s->array[s->TopOfPila];
}

char Pop(Pila s)        // Pop el elemento superior de la pila
{
if (Esvacia(s))
{
printf("Error: La Pila esta llena!");
}
else
return s->array[s->TopOfPila--];
}

int Prioridad(char x, char y)       // Definición de prioridad, '(' tiene la prioridad más alta, y el resto son las mismas que las cuatro aritméticas
{
if ((x == '(') && ((y == '+') || (y == '-') || (y == '*') || (y == '/')))
return 1;
else if (((x == '*') || (x == '/')) && ((y == '+') || (y == '-')))
return 1;
else
return 0;
}

void Convertidor(char* a)       // Infijo al sufijo
{
Pila s = crearPila(100);
int i = 0;

while (a[i]!='\0')
{
if ((a[i] >= '0' && a[i] <= '9') || (a[i] >= 'a' && a[i] <= 'z') || (a[i] >= 'A' && a[i] <= 'Z'))
printf("%c ", a[i]);      // Salida digital directa
else if (a[i] == ')')        
{
while (Top(s) != '(')
printf("%c ", Pop(s));       // Cuando se encuentra el paréntesis derecho, muestre y muestre el elemento superior de la pila hasta que se encuentre el paréntesis izquierdo (el paréntesis izquierdo no se muestra)
Pop(s);
}
else
{
if (Esvacia(s))   // La pila está vacía y se inserta directamente en la pila
Push(s, a[i]);
else if (Prioridad(a[i], Top(s)))     // La prioridad alta se inserta en la pila
Push(s, a[i]);
else
{
while (!Esvacia(s) && (!Prioridad(a[i], Top(s))))   // Pop el elemento superior de la pila hasta que encuentre un elemento de menor prioridad
{
if (Top(s) != '(')    // Solo cuando se encuentra el paréntesis derecho puede aparecer el paréntesis izquierdo
printf("%c ", Pop(s));
else
break;
}
Push(s, a[i]);
}
}
i++;
}

while (!Esvacia(s))    // Después de que se lea la entrada y la pila no esté vacía, todos los elementos de la pila se mostrarán en consecuencia
{
printf("%c ", Pop(s));
}
}




(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.)