Skip to content

Commit afe9577

Browse files
committed
✨ [S2] npi small edits
1 parent dceb7ab commit afe9577

File tree

1 file changed

+15
-4
lines changed

1 file changed

+15
-4
lines changed

content/TDs/S2/02_dataStructures.md

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -59,13 +59,13 @@ Je vous donne plusieurs expressions et leur équivalent en NPI pour vous permett
5959
- `4 + 6 / ( 1 + 2 )` => `4 6 1 2 + / +` = 6
6060

6161

62-
1. Écrire un programme qui permet de saisir une expression arithmétique en **notation polonaise inversée** (**NPI**) en tant que chaîne de caractère. On veut que les éléments de cette expression soient séparés par des espaces.
62+
1. Écrire un programme qui permet de saisir une expression arithmétique en **notation polonaise inversée** (**NPI**) en tant que chaîne de caractère.
6363

6464
:::tip
6565
Vous pouvez utiliser [`getline`](https://en.cppreference.com/w/cpp/string/basic_string/getline) pour récupérer d'un flux (comme `std::cin`) une chaîne de caractères comportant des espaces.
6666
:::
6767

68-
2. Je vous donne le code suivant qui permet à l'aide d'une particularité des **streams** de séparer les éléments(mots) de la chaîne de caractères en utilisant les espaces comme séparateurs:
68+
2. On veut ensuite que les éléments de cette expression soient séparés (par des espaces) pour pouvoir les traiter. Je vous donne le code suivant qui permet à l'aide d'une particularité des **streams** de séparer les éléments(mots) de la chaîne de caractères en utilisant les espaces comme séparateurs:
6969

7070
```cpp
7171
#include <vector>
@@ -83,7 +83,7 @@ std::vector<std::string> split_string(std::string const& s)
8383
8484
Utilisez ce code pour séparer les éléments de l'expression en NPI entrée par l'utilisateur et créer un `std::vector<std::string>` qui représenterons les éléments (`tokens`) de l'expression en **NPI**.
8585
86-
3. Écrire une fonction qui prends une chaîne de caractères et permet de dire si celle-ci représente un nombre flottant ou non.
86+
3. Écrire une fonction qui prends un **token** (sous forme de chaîne de caractères) et permet de dire si celui-ci représente un nombre flottant ou non.
8787
On utilisera le prototype suivant:
8888
```cpp
8989
bool is_floating(std::string const& s);
@@ -174,7 +174,7 @@ Vous pouvez tester avec les expressions suivantes:
174174
Le but est de réécrire le programme précédent en utilisant un **enum** pour représenter les différents **opérateurs** ainsi qu'une structure pour représenter un **token** (un élément de l'expression) avec un champ pour le type (opérateur ou opérande) et des champs pour les valeurs (opérateur ou opérande).
175175
176176
```cpp
177-
enum class Operator { ADD, SUB, MUL, DIV, OPEN_PAREN, CLOSE_PAREN};
177+
enum class Operator { ADD, SUB, MUL, DIV};
178178
enum class TokenType { OPERATOR, OPERAND };
179179
struct Token {
180180
TokenType type;
@@ -211,6 +211,17 @@ Pour cela, il existe un algorithme appelé **Shunting-yard algorithm** (littéra
211211
212212
Son principe est d'utiliser également une **pile** pour stocker les opérateurs rencontrés, et de les dépiler lorsque l'on rencontre un opérateur de priorité supérieure.
213213
214+
215+
::info
216+
217+
On va devoir tenir compte des parenthèses pour déterminer l'ordre des opérations.
218+
On peut donc les ajouter à notre enum `Operator` pour les traiter comme des opérateurs.
219+
220+
```cpp
221+
enum class Operator { ADD, SUB, MUL, DIV, OPEN_PAREN, CLOSE_PAREN};
222+
```
223+
:::
224+
214225
Voilà comment il fonctionne :
215226

216227
- On parcourt l'expression de gauche à droite

0 commit comments

Comments
 (0)