Uruchom symulację i przekształć wyrażenie arytmetyczne zapisane w notacji infiksowej na postfiksową. Informacje teoretyczne dotyczące tego zagadnienia znajdziesz w e‑materiale Odwrotna notacja polskaP10WrdFSpOdwrotna notacja polska.
Uwaga, w symulacji nie stosujemy pełnego nawiasowania.
1
Symulacja 1
W poniższej symulacji interaktywnej twoim zadaniem jest samodzielne przekształcenie wyrażenia arytmetycznego zapisanego w notacji infiksowej na notację postfiksową.
Czasem by przejść dalej, konieczne będzie dokonanie wyboru z podanych opcji. W przypadku slajdów wyjaśniających zawsze możesz przejść do kolejnego slajdu (opcja Przejdź do kolejnego slajdu) lub wrócić do poprzedniego slajdu (opcja Wróć do poprzedniego slajdu), natomiast w slajdach, gdzie konieczny jest wybór kolejnego kroku rozwiązania problemu, powrót do wcześniejszego slajdu jest możliwy, natomiast przejście do kolejnego już nie.
Od trzeciego slajdu możesz również zacząć od nowa i wrócić do pierwszego slajdu (opcja Wróć do pierwszego slajdu i zacznij od nowa).
Ważne!
W wyrażeniu zastosowaliśmy operator ^. Wykorzystujemy go jako operator potęgowania.
1
Przykład 1
W jaki sposób czytać informacje w symulacji?
R1Ua5Uc9dKOwf
Źródło: Contentplus.pl sp. z o.o., licencja: CC BY-SA 3.0.
Symulacja
R1ZhS7EqDKOVv
Źródło: Contentplus.pl sp. z o.o., licencja: CC BY-SA 3.0.
1
Polecenie 2
RTJ1naJDZPAaN
1
Polecenie 3
RkDYbjtvd7Ivh
xxx
1
Polecenie 4
W sekcji „Przeczytaj” przedstawiono program, który przekształca wyrażenia arytmetyczne zapisane w notacji infiksowej na postfiksową.
Zmodyfikuj go tak, by przekształcał wyrażenie arytmetyczne zapisane w notacji postfiksowej na postać infiksową.
Uruchom swój program w środowisku lokalnym i przetestuj dla następującego wyrażenia arytmetycznego zapisanego w postaci postfiksowej:
Linia 1. prawy ukośnik prawy ukośnik Poniżej znajdziesz program z sekcji cudzysłów Przeczytaj cudzysłów przecinek który należy zmodyfikować kropka.
Linia 3. public class Main otwórz nawias klamrowy.
Linia 4. public static void main otwórz nawias okrągły String otwórz nawias kwadratowy zamknij nawias kwadratowy args zamknij nawias okrągły otwórz nawias klamrowy.
Linia 5. String klasyczna znak równości cudzysłów otwórz nawias okrągły otwórz nawias okrągły 8 asterysk 9 zamknij nawias okrągły asterysk otwórz nawias okrągły 3 plus 6 zamknij nawias okrągły zamknij nawias okrągły cudzysłów średnik.
Linia 6. int i znak równości 0 średnik.
Linia 7. i znak równości ONP otwórz nawias okrągły klasyczna przecinek i zamknij nawias okrągły średnik.
Linia 8. zamknij nawias klamrowy.
Linia 10. public static int ONP otwórz nawias okrągły String klasyczna przecinek int i zamknij nawias okrągły otwórz nawias klamrowy.
Linia 11. if otwórz nawias okrągły klasyczna kropka charAt otwórz nawias okrągły i zamknij nawias okrągły wykrzyknik znak równości apostrof otwórz nawias okrągły apostrof zamknij nawias okrągły otwórz nawias klamrowy.
Linia 12. while otwórz nawias okrągły klasyczna kropka charAt otwórz nawias okrągły i zamknij nawias okrągły zamknij nawias ostrokątny znak równości apostrof 0 apostrof ampersant ampersant klasyczna kropka charAt otwórz nawias okrągły i zamknij nawias okrągły otwórz nawias ostrokątny znak równości apostrof 9 apostrof zamknij nawias okrągły otwórz nawias klamrowy.
Linia 13. System kropka out kropka print otwórz nawias okrągły klasyczna kropka charAt otwórz nawias okrągły i zamknij nawias okrągły zamknij nawias okrągły średnik.
Linia 14. i plus znak równości 1 średnik.
Linia 15. zamknij nawias klamrowy.
Linia 16. System kropka out kropka print otwórz nawias okrągły cudzysłów cudzysłów zamknij nawias okrągły średnik.
Linia 17. return i minus 1 średnik.
Linia 18. zamknij nawias klamrowy else otwórz nawias klamrowy.
Linia 19. i znak równości ONP otwórz nawias okrągły klasyczna przecinek i plus 1 zamknij nawias okrągły średnik.
Linia 20. i plus znak równości 1 średnik.
Linia 21. char operator znak równości klasyczna kropka charAt otwórz nawias okrągły i zamknij nawias okrągły średnik.
Linia 22. i znak równości ONP otwórz nawias okrągły klasyczna przecinek i plus 1 zamknij nawias okrągły średnik.
Linia 23. i plus znak równości 1 średnik.
Linia 24. System kropka out kropka print otwórz nawias okrągły operator plus cudzysłów cudzysłów zamknij nawias okrągły średnik.
Linia 25. return i średnik.
Linia 26. zamknij nawias klamrowy.
Linia 27. zamknij nawias klamrowy.
Linia 28. zamknij nawias klamrowy.
// Poniżej znajdziesz program z sekcji "Przeczytaj", który należy zmodyfikować.
public class Main {
public static void main(String[] args) {
String klasyczna = "((8*9)*(3+6))";
int i = 0;
i = ONP(klasyczna, i);
}
public static int ONP(String klasyczna, int i) {
if (klasyczna.charAt(i) != '(') {
while (klasyczna.charAt(i) >= '0' && klasyczna.charAt(i) <= '9') {
System.out.print(klasyczna.charAt(i));
i += 1;
}
System.out.print(" ");
return i - 1;
} else {
i = ONP(klasyczna, i + 1);
i += 1;
char operator = klasyczna.charAt(i);
i = ONP(klasyczna, i + 1);
i += 1;
System.out.print(operator + " ");
return i;
}
}
}
RyuUwBw2TMX15
Linia 1. import java kropka util kropka Stack średnik.
Linia 3. public class Main otwórz nawias klamrowy.
Linia 4. public static void main otwórz nawias okrągły String otwórz nawias kwadratowy zamknij nawias kwadratowy args zamknij nawias okrągły otwórz nawias klamrowy.
Linia 5. String ONP znak równości cudzysłów 8 9 asterysk 3 6 plus asterysk cudzysłów średnik.
Linia 6. System kropka out kropka println otwórz nawias okrągły infiksowa otwórz nawias okrągły ONP zamknij nawias okrągły zamknij nawias okrągły średnik.
Linia 7. zamknij nawias klamrowy.
Linia 9. public static String infiksowa otwórz nawias okrągły String ONP zamknij nawias okrągły otwórz nawias klamrowy.
Linia 10. Stack otwórz nawias ostrokątny String zamknij nawias ostrokątny stos znak równości new Stack otwórz nawias ostrokątny zamknij nawias ostrokątny otwórz nawias okrągły zamknij nawias okrągły średnik.
Linia 12. String otwórz nawias kwadratowy zamknij nawias kwadratowy tokeny znak równości ONP kropka split otwórz nawias okrągły cudzysłów cudzysłów zamknij nawias okrągły średnik.
Linia 14. for otwórz nawias okrągły int i znak równości 0 średnik i otwórz nawias ostrokątny tokeny kropka length średnik i plus plus zamknij nawias okrągły otwórz nawias klamrowy.
Linia 15. String znak znak równości tokeny otwórz nawias kwadratowy i zamknij nawias kwadratowy średnik.
Linia 16. if otwórz nawias okrągły czyLiczba otwórz nawias okrągły znak zamknij nawias okrągły zamknij nawias okrągły otwórz nawias klamrowy.
Linia 17. stos kropka push otwórz nawias okrągły znak zamknij nawias okrągły średnik.
Linia 18. zamknij nawias klamrowy else otwórz nawias klamrowy.
Linia 19. String prawy znak równości stos kropka pop otwórz nawias okrągły zamknij nawias okrągły średnik.
Linia 20. String lewy znak równości stos kropka pop otwórz nawias okrągły zamknij nawias okrągły średnik.
Linia 21. stos kropka push otwórz nawias okrągły cudzysłów otwórz nawias okrągły cudzysłów plus lewy plus znak plus prawy plus cudzysłów zamknij nawias okrągły cudzysłów zamknij nawias okrągły średnik.
Linia 22. zamknij nawias klamrowy.
Linia 23. zamknij nawias klamrowy.
Linia 25. return stos kropka pop otwórz nawias okrągły zamknij nawias okrągły średnik.
Linia 26. zamknij nawias klamrowy.
Linia 28. public static boolean czyLiczba otwórz nawias okrągły String znak zamknij nawias okrągły otwórz nawias klamrowy.
Linia 29. for otwórz nawias okrągły int i znak równości 0 średnik i otwórz nawias ostrokątny znak kropka length otwórz nawias okrągły zamknij nawias okrągły średnik i plus plus zamknij nawias okrągły otwórz nawias klamrowy.
Linia 30. if otwórz nawias okrągły wykrzyknik Character kropka isDigit otwórz nawias okrągły znak kropka charAt otwórz nawias okrągły i zamknij nawias okrągły zamknij nawias okrągły zamknij nawias okrągły otwórz nawias klamrowy.
Linia 31. return false średnik.
Linia 32. zamknij nawias klamrowy.
Linia 33. zamknij nawias klamrowy.
Linia 34. return true średnik.
Linia 35. zamknij nawias klamrowy.
Linia 36. zamknij nawias klamrowy.
import java.util.Stack;
public class Main {
public static void main(String[] args) {
String ONP = "8 9 * 3 6 + *";
System.out.println(infiksowa(ONP));
}
public static String infiksowa(String ONP) {
Stack<String> stos = new Stack<>();
String[] tokeny = ONP.split(" ");
for (int i = 0; i < tokeny.length; i++) {
String znak = tokeny[i];
if (czyLiczba(znak)) {
stos.push(znak);
} else {
String prawy = stos.pop();
String lewy = stos.pop();
stos.push("(" + lewy + znak + prawy + ")");
}
}
return stos.pop();
}
public static boolean czyLiczba(String znak) {
for (int i = 0; i < znak.length(); i++) {
if (!Character.isDigit(znak.charAt(i))) {
return false;
}
}
return true;
}
}