You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: content/TDs/S2/02_dataStructures.md
+15-4Lines changed: 15 additions & 4 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -59,13 +59,13 @@ Je vous donne plusieurs expressions et leur équivalent en NPI pour vous permett
59
59
-`4 + 6 / ( 1 + 2 )` => `4 6 1 2 + / +` = 6
60
60
61
61
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.
63
63
64
64
:::tip
65
65
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.
66
66
:::
67
67
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:
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**.
85
85
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.
87
87
On utilisera le prototype suivant:
88
88
```cpp
89
89
bool is_floating(std::string const& s);
@@ -174,7 +174,7 @@ Vous pouvez tester avec les expressions suivantes:
174
174
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).
175
175
176
176
```cpp
177
-
enum class Operator { ADD, SUB, MUL, DIV, OPEN_PAREN, CLOSE_PAREN};
177
+
enum class Operator { ADD, SUB, MUL, DIV};
178
178
enum class TokenType { OPERATOR, OPERAND };
179
179
struct Token {
180
180
TokenType type;
@@ -211,6 +211,17 @@ Pour cela, il existe un algorithme appelé **Shunting-yard algorithm** (littéra
211
211
212
212
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.
213
213
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};
0 commit comments