2009-11-12 7 views
0

Mettre en oeuvre un réseau de piles où les piles sont définis:Mettre en oeuvre un réseau de piles à C

typedef struct StackNode { 

    int data; 

    StackNode* next; 

} StackNode; 

Chaque point de l'élément de tableau à une pile, chaque pile est initialisé comme une pile vide. Lorsque vous commencez à ajouter des éléments, il va commencer à les ajouter à la pile dans Stacks[0]; si vous dites -2 dans stdin puis 4 par exemple, les entrées suivantes iront à Stacks[4];

Par exemple:

5 10 -2 3 9 7 89 -1 
will result in : 
Stacks[0] -> 10 -> 5 
Stacks[1] 
Stacks[2] 
Stacks[3] -> 89 -> 7 -> 9 

-1 va arrêter le code de fonctionner.

J'ai problème avec la mise en œuvre d'un ensemble de piles de sorte que toute aide serait appréciée :)

+0

Il n'est pas devoirs, mais il fait partie du code que je suis en train d'écrire et je suis en train de finir le plus tôt possible . Je pense que je comprends tout sauf l'idée de mettre en œuvre le tableau. Donc si c'était juste une pile pour pousser et faire éclater des éléments, ça aurait été facile. Merci pour la réponse :) – c2009l123

+1

Pouvez-vous poster le code qui fonctionne réellement sur la structure? Ou avez-vous des problèmes même pour commencer? Je pense que cela a probablement besoin de l'étiquette de devoirs, comme l'a suggéré jinguy. –

+0

même si ce n'est pas un devoir? – c2009l123

Répondre

2
int t = 0, index = 0; 
while(t != -1) 
{ 
    scanf("%d", &t); 
    if(t == -2) 
    { 
    scanf("%d", &t); 
    index = t; 
    continue; 
    } 
    if(t >= 0) 
    push(stacks[index], t); 
} 
+0

et la fonction de poussée serait juste comme push (StackNode * tp, int t) droit? Je ne veux pas dire StackNode * tp [int i] ou quelque chose comme ça? – c2009l123

+0

Si 'stacks' est un tableau de pointeurs vers des objets StackNode, oui, votre signature pour la fonction push est correcte. – Amarghosh

+0

Merci, l'information que vous avez fournie était très utile :) – c2009l123

2

la ligne 3 de

typedef struct StackNode { 
    int data; 
    StackNode* next;   /* line 3 */ 
} StackNode; 

le type StackNode n'existe pas encore. Le type StackNode commence seulement à exister une fois que le type struct StackNode est entièrement analysé.

Mais le type struct StackNode existe déjà à ce stade. Il est encore incomplet, mais vous pouvez déclarer des pointeurs.

typedef struct StackNode { 
    int data; 
    struct StackNode* next;   /* line 3 */ 
} StackNode; 
+0

Ce n'est pas ce que je suis confronté à un problème avec si. Par exemple, vous pouvez: StackNode * Stacks [10]; pour créer un tableau de piles de taille 10. Cependant, j'ai du mal à faire des opérations comme pousser par exemple à un nombre spécifique dans le tableau. – c2009l123

0

Cela ne ressemble pas à une pile, cela ressemble à une liste chaînée. Bien sûr, vous pouvez implémenter une sémantique de type pile en utilisant une liste chaînée, mais ce n'est généralement pas ce que l'on entend par "une pile".

Pour pousser un nouveau numéro, vous devez:

  • Allouer un nouveau StackNode.
  • Initialisez-le avec le nouveau numéro.
  • Lien vers le précédent.

Vous pouvez résumer cela en fonction:

void stack_push(StackNode *root, int value) 
{ 
    /* Code omitted */ 
} 

alors vous juste besoin de fournir la pile appropriée afin de contrôler sur lequel de vos nombreuses piles pour pousser le nouveau numéro:

stack_push(&Stacks[2], 4711); 
+0

J'ai fait cela, mais comment pousser le nombre à une pile spécifique qui est liée à un nombre spécifique dans le tableau. Par exemple, je veux pousser le numéro (3) à Stacks [5] ou un numéro de Stacks [2] – c2009l123

0

Si vous allez au fond de this Wikipedia article, vous verrez un exemple de ce que je pense que vous essayez de mettre en œuvre. Ce que vous avez est une liste chaînée. En outre, voici quelques doubly linked list helpers pratiques qui pourraient servir d'exemple.

Si vous affichez l'utilisation réelle de votre code tel quel, vous pourriez recevoir une meilleure réponse (plus spécifique).

0

Vous devez d'abord obtenir un tableau de StackNode s:

StackNode ** stacks = malloc(sizeof(StackNode*) * 5); /* allocate 5 stack nodes */ 
stacks[0] = malloc(sizeof(StackNode)); /* allocate first stack */ 
... 

Maintenant vous avez une fonction push(StackNode *, int value).Pour pousser sur une certaine pile, appelez-la avec push(stacks[2], value) (pour pousser sur la troisième pile, par exemple).

+0

dois-je le faire un par un? Que faire si j'ai 100 piles, est-ce que je devrais juste boucler dessus? Cela semble un peu inefficace – c2009l123

+0

Oui, vous devez faire une boucle. –

1

Vous pouvez essayer quelque chose comme ce qui suit (testé):

//includes 
#define SIZE 10 


typedef struct StackNode{ 
int data ; 
struct StackNode* next ; 
}StackNode ; 



StackNode* new_stackNode(int num) 
{ 
StackNode* ptr = (StackNode*)malloc(sizeof(StackNode)) ; 
ptr->data = num ; 
ptr->next = 0 ; 
return ptr ; 
} 



int main() 
{ 
StackNode *arr[SIZE] = {0}; 
int st_index = 0 ; 
int num = 0 ; 
while(num != -1) 
{ 
    scanf("%d",&num); 
    if(num == -2) 
    st_index++ ; 
    else 
    { 
    StackNode* ptr = new_stackNode(num) ; 
    ptr->next = arr[st_index] ; 
    arr[st_index] = ptr ; 
    } 
} 
} 
Questions connexes