web-dev-qa-db-fra.com

Que signifient Push and Pop pour les piles?

longue histoire courte mon conférencier est de la merde, et nous montrait des piles de préfixe via un rétroprojecteur et son ombre bigass bloquait tout, donc j'ai raté les choses importantes

il faisait référence à Push and pop, Push = 0 pop = x

il a donné un exemple mais je ne vois pas du tout comment il obtient sa réponse,

2*3/(2-1)+5*(4-1)

étape 1 Marche arrière: )1-4(*5+)1-2(/3*2 ok je peux voir ça

il a ensuite continué à écrire les opérations de x et o et je me suis totalement perdu

répondre 14-5*12-32*/+ puis inversé à nouveau pour obtenir +/*23-21*5-41

si quelqu'un pouvait m'expliquer la Push pop pour que je puisse comprendre, je serais très reconnaissant, j'ai regardé en ligne mais beaucoup de choses que je trouve semblent être une étape au-dessus de cela, donc j'ai vraiment besoin de comprendre ici d'abord

24
adam shankman

J'espère que cela vous aidera à visualiser une pile et comment elle fonctionne.

Pile vide:

|     |
|     |
|     |
-------

Après avoir poussé A, vous obtenez:

|     |
|     |
|  A  |
-------

Après avoir poussé B, vous obtenez:

|     |
|  B  |
|  A  |
-------

Après Popping, vous obtenez:

|     |
|     |
|  A  |
-------

Après avoir poussé C, vous obtenez:

|     |
|  C  |
|  A  |
-------

Après Popping, vous obtenez:

|     |
|     |
|  A  |
-------

Après Popping, vous obtenez:

|     |
|     |
|     |
-------
105
Onion-Knight

L'analogie avec le clip de fusil publiée par Oren A est assez bonne, mais je vais en essayer une autre et essayer d'anticiper ce que l'instructeur essayait de faire passer.

Une pile, comme son nom l'indique est un arrangement de "choses" qui a:

  • Un haut
  • Un fond
  • Une commande entre le haut et le bas (par exemple, la deuxième à partir du haut, la 3e à partir du bas).

(pensez-y comme une pile littérale de livres sur votre bureau et vous ne pouvez prendre que quelque chose du haut)

Pousser quelque chose sur la pile signifie "le placer sur le dessus". Faire sauter quelque chose de la pile signifie "enlever la" chose "supérieure de la pile.

Une utilisation simple consiste à inverser l'ordre des mots. Dites que je veux inverser le mot: "pop-corn". J'appuie sur chaque lettre de gauche à droite (les 7 lettres), puis je dépose 7 lettres et elles finiront dans l'ordre inverse. On dirait que c'est ce qu'il faisait avec ces expressions.

Poussez (p) Poussez (o) Poussez (p) Poussez (c) Poussez (o) Poussez (r) Poussez (n)

après avoir poussé le mot entier, la pile ressemble à:

   |  n   |  <- top
   |  r   |
   |  o   |
   |  c   |
   |  p   |
   |  o   |
   |  p   |  <- bottom (first "thing" pushed on an empty stack)
    ======

quand je pop () sept fois, je reçois les lettres dans cet ordre:

n, r, o, c, p, o, p

la conversion d'infixe/postfixe/préfixe est un exemple pathologique en informatique lors de l'enseignement des piles:

conversion Infix en Postfix.

La conversion après correction en une expression d'infixe est assez simple:

(expression de balayage de gauche à droite)

  1. Pour chaque nombre (opérande) Poussez-le sur la pile.
  2. Chaque fois que vous rencontrez un opérateur (+, -, /, *), sortez deux fois de la pile et placez l'opérateur entre eux. Poussez cela sur la pile:

Donc, si nous avons 53 + 2 *, nous pouvons le convertir en infix dans les étapes suivantes:

  1. Appuyez sur 5.
  2. Appuyez sur 3.
  3. Rencontré +: pop 3, pop 5, Push 5 + 3 sur la pile (soyez cohérent avec l'ordre de 5 et 3)
  4. Appuyez sur 2.
  5. Rencontré *: pop 2, pop (5 + 3), Push (2 * (5 + 3)).

* Lorsque vous atteignez la fin de l'expression, si elle est correctement formée, vous ne devez empiler qu'un seul élément.

En introduisant "x" et "o", il peut les avoir utilisés comme supports temporaires pour les opérandes gauche et droit d'une expression d'infixe: x + o, x - o, etc. (ou ordre de x, o inversé).

Il y a un Nice écrivez sur wikipedia aussi. J'ai laissé ma réponse comme un wiki au cas où j'aurais bâclé tout ordre d'expressions.

13
John Carter

L'algorithme pour passer des expressions infixes aux préfixes est:

-reverse input

TOS = top of stack
If next symbol is:
 - an operand -> output it
 - an operator ->
        while TOS is an operator of higher priority -> pop and output TOS
        Push symbol
 - a closing parenthesis -> Push it
 - an opening parenthesis -> pop and output TOS until TOS is matching
        parenthesis, then pop and discard TOS.

-reverse output

Donc, votre exemple va quelque chose comme (x Push, o POP):

2*3/(2-1)+5*(4-1)
)1-4(*5+)1-2(/3*2

Next
Symbol  Stack           Output
)       x )
1         )             1
-       x )-            1
4         )-            14
(       o )             14-
        o               14-
*       x *             14-
5         *             14-5
+       o               14-5*
        x +             14-5*
)       x +)            14-5*
1         +)            14-5*1
-       x +)-           14-5*1
2         +)-           14-5*12
(       o +)            14-5*12-
        o +             14-5*12-
/       x +/            14-5*12-
3         +/            14-5*12-3
*       x +/*           14-5*12-3
2         +/*           14-5*12-32
        o +/            14-5*12-32*
        o +             14-5*12-32*/
        o               14-5*12-32*/+

+/*23-21*5-41
11
ninjalj

Une pile est une structure de données LIFO (Last In First Out). Les opérations Push et pop sont simples. Push place quelque chose dans la pile, pop enlève quelque chose. Vous placez en haut, et enlever le haut, pour conserver l'ordre LIFO.

modifier - corrigé de FIFO, à LIFO. Facepalm!

pour illustrer, vous commencez avec une pile vide

|

alors vous poussez 'x'

| 'X'

alors vous poussez 'y'

| "x" "y"

alors tu sautes

| 'X'

4
hvgotcodes

D'accord. Comme les autres répondants l'ont expliqué, une pile est une structure de données de dernier entré, premier sorti. Vous ajoutez un élément en haut de la pile avec une opération Push. Vous retirez un élément du haut avec une opération Pop. Les éléments sont supprimés dans l'ordre inverse de l'ordre dans lequel ils ont été insérés (d'où Last In, First Out). Par exemple, si vous poussez les éléments 1, 2, 3 dans cet ordre, le chiffre 3 sera en haut de la pile. Une opération Pop le supprimera (c'était la dernière entrée) et laissera 2 en haut de la pile.

Concernant le reste de la conférence, le conférencier a essayé de décrire une machine basée sur la pile qui évalue les expressions arithmétiques. La machine fonctionne en faisant sauter en continu 3 éléments du haut de la pile. Les deux premiers éléments sont des opérandes et le troisième est un opérateur (+, -, *, /). Il applique ensuite cet opérateur sur les opérandes et pousse le résultat sur la pile. Le processus se poursuit jusqu'à ce qu'il n'y ait qu'un seul élément sur la pile, qui est la valeur de l'expression.

Supposons donc que nous commencions par pousser les valeurs "+/* 23-21 * 5-41" de gauche à droite dans la pile. Nous éclatons ensuite 3 éléments par le haut. Le dernier entré est le premier sorti, ce qui signifie que les 3 premiers éléments sont "1", "4" et "-" dans cet ordre. Nous poussons le numéro 3 (le résultat de 4-1) sur la pile, puis éclatons les trois éléments les plus hauts: 3, 5, *. Poussez le résultat, 15, sur la pile, etc.

3
Amnon
  • Push = ajouter à la pile
  • pop = retirer de la pile
3
Chris Halcrow

Une pile est en principe assez simple: imaginez le clip d'un fusil - Vous ne pouvez accéder qu'à la balle la plus haute - la retirer est appelée "pop", en insérer une nouvelle s'appelle "Push".
Un exemple très utile pour cela est pour les applications qui vous permettent de "défaire".
Imaginez que vous enregistrez chaque état de l'application dans une pile. par exemple. l'état de l'application après chaque type créé par l'utilisateur.
Maintenant, lorsque l'utilisateur appuie sur "Annuler", vous venez de "pop" l'état précédent de la pile. Pour chaque action que l'utilisateur fait - vous "poussez" le nouvel état vers la pile (c'est bien sûr simplifié).
À propos de ce que votre conférencier faisait spécifiquement - afin de l'expliquer, d'autres informations seraient utiles.

2
Oren A

Simplement:

  • pop: renvoie l'élément en haut puis retirez-le de la pile

  • Push: ajoutez un élément en haut de la pile.

2
habibhassani

après tous ces bons exemples, adam shankman n'a toujours pas de sens. Je pense que vous devriez ouvrir du code et l'essayer. La seconde où vous essayez un myStack.Push (1) et myStack.Pop (1), vous devriez vraiment obtenir l'image. Mais de par son apparence, même cela sera un défi pour vous!

1
Induster