ביטויים מתמטיים PostFix, PreFix, InFix אחד היישומים החשובים של הינו ייצוגם של ביטויים מתמטיים. - חיבור, חיסור, כפל, וחילוק הינה פעולה בינארית, כלומר פעולה שבה יש כל אחת מהפעולות המתמטיות אחד - הפעולה החישובית, הפועל על שני אופרנדים (operand) - המשתנים או המספרים אופרטור (operator) עליהם מבוצעת הפעולה החישובית. ניתן לייצג פעולה חישובים באחד משלושת הייצוגים: A + B האופרטור נמצא בין שני האופרנדים: - infix ייצוג תוכי + A B האופרטור נמצא לפני האופרנדים: - prefix ייצוג תחילי A B + האופרטור נמצא אחרי שני האופרנדים: - postfix ייצוג סופי כדי לחשב את הביטוי A + B * C של הפעולות החישוביות. כפי שהוא כתוב בייצוג תוכי, יש להתחשב בכללי הקדימויות (precedence) כללי הקדימות )מהגבוה לנמוך(: העלאה בחזקה )נסמן אותה בסימן ^ ) כפל, חילוק חיבור, חיסור כאשר מופיעים כמה אופרטורים מאותה דרגת קדימות, יהיה סדר הקדימויות משמאל לימין כאשר מופיעות כמה פעולות חזקה A, ^ B ^ C יהיה סדר הקדימויות מימין לשמאל: (C A ^ B) ^ שימוש בסוגריים מאפשר לכפות סדר קדימויות שונה. ייצוג תוכי במתמטיקה אנו מבצעים חישובים בייצוג תוכי )האופרטור נמצא בתוך / בין האופרנדים עליהם היא מתבצעת( לדוגמה: + ייצוג תוכי מחייב שימוש בסוגריים כדי לשמור על סדר החישוב הרצוי: ( ( + *
המרה לייצוג סופי בייצוג סופי, מופיע האופרטור אחרי האופרנדים. כדי להמיר מייצוג תוכי לייצוג סופי, הרי שעל פי כללי הקדימות, עלינו להמיר תחילה את חלק הביטוי המחושב ראשון, ולאחריו את חלק הביטוי המחושב אחריו בסדר הקדימויות. תרגיל : המר כל אחד מהביטויים שלהלן מייצוג תוכי לייצוג סופי. ייצוג תוכי A + B A + B - C (A + B) * (C - D) A ^ B * C - D + E / F / (G + H) ((A + B) * C - (D - E)) ^ (F + G) A - B / (C * D ^ E) ייצוג סופי המרה לייצוג תחילי בייצוג תחילי, מופיע האופרטור לפני האופרנדים. תרגיל : המר כל אחד מהביטויים שלהלן מייצוג תוכי לייצוג תחילי. ייצוג תוכי A + B A + B - C (A + B) * (C - D) A ^ B * C - D + E / F / (G + H) ((A + B) * C - (D - E)) ^ (F + G) A - B / (C * D ^ E) ייצוג תחילי שים לב לכך שהייצוג התחילי של ביטוי מורכב אינו תמונת ראי של הייצוג הסופי. ביטויים בייצוג סופי ותחילי אינם זקוקים לסוגריים. סדר הופעת האופרטורים בביטוי בייצוגים אלו קובע את סדר הפעולות בחישוב הביטוי.
חישוב ביטוי בייצוג סופי )'+', '-', '*', '/', '^' להלן אלגוריתם לחישוב הערך של ביטוי בייצוג סופי, תוך שימוש במחסנית. כל אופרטור במחרוזת מתייחס לשני האופרנדים הקודמים לו במחרוזת. שים שכל אחד מהאופרנדים יכול להיות תוצאה של הפעלת אופרטור קודם. צור מחסנית-מספרים-ממשיים ריקה נתונה מחרוזת הקלט. כל עוד לא סוף המחרוזת בצע: קרא האות הבאה. אם אחרת - אופרנד, דחוף אותו למחסנית. )אם לא אחד האופרטורים: // זהו אופרטור שהאופרנדים שלו הם שני הפריטים העליונים במחסנית שלוף שני פריטים עליונים במחסנית בצע עליהם את הפעולה המצוינת על ידי האופרטור. דחוף את התוצאה חזרה למחסנית )זהו האופרנד עבור האופרטור הבא(.......... שלוף התוצאה מהמחסנית. שים : אם בעת ניסיון השליפה מתברר שהמחסנית ריקה יש שגיאה בביטוי. 4 + - 8 / + * ^ + נדגים את פעולת האלגוריתם על הביטוי הבא המובא בייצוג סופי: x + - 8 / + * ^ + op 8 49 op 4 result 4 49 49 stk [] [, ] [,, ] [, ] [] [, ] [8,, ] [, 8,, ] [4,, ] [, ] [] [, ] [49] [, 49] [] התוצאה result היא.
4 A=, B=, C= תרגיל : חשב לפי האלגוריתם שלעיל, את הביטויים שלהלן בייצוג סופי: הנח כי: A B + C - C ^ A B C + * C B A - + * א. ב..post fix תרגיל 4: כתוב תכנית לחישוב ערך ביטוי להלן חתימת הפעולה: פעולות עזר: פעולה המקבלת מחרוזת המכילה ביטוי postfix כך שכך אופרנד הינו מספר חד ספרתי, */ ומחזירה את תוצאת הביטוי */ public static double postfix (String expr) תיאור הפעולה פעולה המקבלת תו ומחזירה אמת אם הוא פעולה מהסוג: ^, /, *, -, + ושקר אחרת חתימת הפעולה boolean isoperand (char ch) int tonumber (char ch) double resultof (double op, double op, char op) פעולה המקבלת תו המכיל ספרה ומחזירה את ערכו המספרי פעולה המקבלת שני מספרים ממשיים ופעולה ומחזירה את התוצאה המתקבלת: op op op postfix והערכים הם מספרים תרגיל : שנה את הפעולה כך שתקלוט ביטוי הכתוב ב- )לאו דווקא חד-ספרתיים( הנחיות: הערכים יוקלדו כשהם מופרדים בתו רווח. קבע סימן מיוחד )נניח #( שיזוהה כסוף הביטוי. double x = Double.parseDouble(str); השתמש בפעולה המקבלת כפרמטר מחרוזת של ספרות ונקודה עשרונית וממירה אותה למספר ממשי. הנחה: המחרוזת תקינה )כלומר - ניתנת להמרה למספר ממשי(. הערה: קיימת פעולה מקבילה במחלקה Integer
המרת ביטוי תוכי לביטוי סופי. אלגוריתם הקולט ביטוי בייצוג תוכי, תו אחר תו וממיר אותו לביטוי בייצוג סופי. הנחה: הביטוי שנקלט מכיל סוגריים עגולים בלבד )סוגריים מקוננים( צור מחרוזת ריקה str. צור מחסנית-תווים ריקה stk. קרא תו ראשון מהקלט ch.4 כל עוד לא נגמר הקלט, בצע: ch( אם 4. 4. אם 4. str 4.4 4. סוגר פותח/שמאלי( דחוף את ch למחסנית אם ch( סוגר סוגר/ימני( שלוף את תוכן המחסנית עד )לא כולל( הסוגר השמאלי ושרשר למחרוזת.str בסיום - שלוף את הסוגר השמאלי. ch( אופרטור /פעולה-חשבונית( שלוף מהמחסנית את כל הפעולות בדרגת קדימויות גבוהה יותר ושרשר אותן למחרוזת בסיום - דחוף את ch למחסנית אם ch( ספרה/מספר( שרשר אותו למחרוזת str קרא את התו הבא מהקלט ch. כל עוד המחסנית אינה ריקה שלוף ושרשר את תוכן המחסנית למחרוזת str (+)*(8-) נדגים את פעולת האלגוריתם על הביטוי הבא המובא בייצוג תוכי: ch str ( "" + ) + * + ( + 8 + 8 - + 8 + 8 ) + 8 - \r + 8 - * + 8 - * stk [ ( ] [ ( ] [ +, ( ] [ +, ( ] [ ] [ * ] [ (, * ] [ (, * ] [ -, (, * ] [ -, (, * ] [ * ] [ ] :(postfix) דחיפת ( הפעולה דחיפת + שליפה ושרשור, שליפת דחיפת דחיפת ) * ) - דחיפת שליפה ושרשור, שליפת הסתיים הקלט, שליפה ו ) תוצאת ההמרה מביטוי תוכי (infix) לביטוי סופי
תרגיל : הוסף לתכנית פעולה שתקלוט את הביטוי בייצוג תוכי תו אחר תו. המחרוזת שנקלטה תשלח כפרמטר לפעולה המחשבת ומחזירה את ערך הביטוי.postfix --- פעולה הקולטת ביטוי בייצוג תוכי ממירה ומחזירה את הביטוי בייצוג סופי ---// public static String infixtopostfix() פעולות עזר: תיאור הפעולה פעולה המקבלת את התו שבראש המחסנית stkch ואת תו הקלט strch ומחזירה אמת אם התו שבראש המחסנית בעל קדימות גבוהה או שווה לקדימות של התו השני, ושקר אחרת. חתימת הפעולה boolean stronger (char stkch, char strch) int find (char [] arr, char ch) פעולה המקבלת את מערך הפעולות החישוביות ותו המכיל פעולה ומחזירה את מיקומו של התו במערך. )ככל שהמיקום במערך גבוה יותר, הפעילות בעלת קדימות גבוהה יותר.( הנחיות: כדי לחשב את הקדימות של הפעולה, ניצור את המערך הבא, המכיל את הפעולות החישוביות כך שהפעולה בעלת הקדימות הנמוכה בתחילת המערך וזו בעלת הקדימות הגבוהה בסופו: char [] arr = { '(', '+', '-', '*', '/', '^' }; נכניס גם את הסוגר השמאלי למערך, כשהוא בעל הקדימות הנמוכה ביותר. כשנקלט תו שהוא פעולה, נשתמש בפעולה stronger כדי להוציא מהמחסנית את כל התווים הקודמ םי לו או שווים לו בסדר הקדימויות. סיום השליפה כשימצא תו בעל קדימות נמוכה או עד שנתקלנו בסוגר שמאלי )שאמור להישלף רק כשמגיע סוגר ימני(. הפעולה stronger מוצאת את מקומו של התו שבראש המחסנית במערך )שימוש בפעולה )find ואת מקומו של התו שנקלט. אם המקום של התו שבמחסנית גבוה מזה של התו שנקלט, הרי שהקדימות שלו גבוהה יותר. אם הקדימות זהה, יש לבצע תחילה את הפעולה שבמחסנית )היא נמצאת משמאל לפעולה החדשה( ולכן גם היא תישלף ותשורשר למחרוזת. כשתסתיים השליפה, יידחף התו למחסנית.