2009-11-05 9 views
13

¿Alguien sabe dónde puedo encontrar un ejemplo de Spaghetti stack escrito en C?pila de espagueti en C

+2

+1 para una de las estructuras de datos más extrañas, útil casi solo en las pilas de tablas de símbolos para la compilación .. – Jack

+3

@Jack: "casi" aparte, las pilas de espagueti también son muy útil en la implementación de continuaciones. – outis

+0

@outis ¿Puedes explicar los usos de la pila Spaghetti porque no sé por qué se usa esta estructura de datos? – Jerky

Respuesta

5

Debe ser algo similar a:

struct stack_item; 

struct stack_item 
{ 
    stack_item *parent; 
    void *ptr_data; 
}; 

stack_item *stack_pointer = null; 

void push(stack_item *item) 
{ 
    if (stack_pointer == null) 
     item->parent = null; 
    else 
     item->parent = cur; 

stack_pointer = item; 
} 

/* like push but doesn't update cur stack item to the one pushed, just add a child */ 
void push_parallel(stack_item *item) 
{ 
    if (stack_pointer == null) 
    { 
     stack_pointer = item; 
     item->parent = null; 
    } 
    else 
     item->parent = stack_pointer; 
} 

stack_item *pop() 
{ 
    if (stack_pointer == null) 
    { 
     printf("error: stack is empty.\r\n"); 
     return null; 
    } 

    stack_item *current = stack_pointer; 
    stack_pointer = current->parent; 

    return current; 
} 

cuenta que un espaguetis pila es útil cuando se desea mantener las referencias de las cosas que se salen de la pila, que tiene muchas lista enlazada paralelo que terminan en una raíz común. Por lo tanto, debe conservar las referencias del elemento que sale porque debe recorrerlas en un de abajo hacia arriba desde la hoja hasta la raíz y, por supuesto, usar un nodo hoja diferente producirá una lista vinculada diferente que tiene elementos en común con otras listas que comienzan desde otras hojas ...

+0

¿Qué es cur? nunca definiste lo que es ... – Ralph

+0

¿no debería la función push_parallel devolver un puntero a la parte superior de la pila? – Ralph

+0

cur es solo un error debido a stack_pointer que se llamó de una manera diferente, lo arreglé. Para la función push_parallel depende, el hecho es que una pila de espagueti realmente no tiene UNA parte superior de la pila, pero muchos de acuerdo con el lugar desde el que comienzas a visitarla, por lo general, debes preocuparte solo por las referencias externas a la pila. – Jack