תקוע בתרגיל גאווה - Stack - עמוד 2 - תכנות - HWzone פורומים
עבור לתוכן
  • צור חשבון

תקוע בתרגיל גאווה - Stack


maor18
 Share

Recommended Posts

ציטוט של af db creid

אין שום צורך בלהטוטי stack מסובכים. לStack יש פונקציה בשם elementAt שעושה בדיוק את מה שהשם שלה מרמז :)

ושוב, בדיוק בזה אסור לנו לגעת.

היחידים שמותר לנו הם push,pop,top וisEmpty. 3 .

הלוואי שהחיים שלנו היו קלים יותר

קישור לתוכן
שתף באתרים אחרים

ציטוט של af db creid

רגע, לא השתמשת בשלוש stacks? ואסור?

מותר לנו להשתמש בכמה stacks שאנחנו רוצים, אבל בתנאי שהם עומדים בדיוק במה שלמדנו (שזה מה שכתבתי לך למעלה) 

ציטוט של af db creid

ואם תיתן שמות משמעותיים למשתנים יהיה קל יותר להבין מה הקוד שלך מנסה לעשות.

temp1 מתיימר להיות המחסנית שאליה עוברים כל הספרות ששוות למספר. אל temp עוברים כל הספרות שלא שוות. זה בעיקרון הרעיון, אבל אני לא מצליח ליישם אותו

קישור לתוכן
שתף באתרים אחרים

לא מומחה לג'אווה אבל מכיר מבני נתונים ובכללי זו שאלה של אלגוריתמקיה (בגלל זה יש הרבה "אסור") אז אתן את השנקל שלי.


נניח ויש לך 3 מחסניות (זה first in last out?) מחסנית אחת הנתונה, ועוד 2 עזר StackIn, StackA, StackB
תבחר כיוון שרירותי ממנו עבורו תחפש רצף (אחדות, עשרות מאות וכו' למשל) ותתחיל לבדוק את הראש ובמידה ואין שיוון בין ספרת האחדות לראש, שפוך מIn ל-A. 
במידה ותמצא איבר בIn שתואם לספרת האחדות של הנתון, כעת תתחיל לשפוך איברים לB במקום A. 
כעת יש 2 מקרים, 1 שמצאת רצף וסיימת. 2 - אין שיוון באחד מהספרות ולכן אתה צריך לשפוך הכל מB חזרה לIn, ואת אותה הספרה שממנה בדקת אם מתחיל רצף לשפוך שוב לA ולהמשיך כך עם האיבר שאחריו.

עכשיו יתכן שמחסנית A תתמלא ולא תמצא רצף בגלל שבדקת בכיוון הלא נכון, אבל מה טוב, המסנית A היא בדיוק הפוכה מIn ולכן אתה יכול לעשות את אותן הפעולות כמו קודם, רק שתתחיל לבדוק ולשפוף מA לIn.

מקווה שמספיק מובן.
ממליץ לך לתרגם את הטקסט לכתיב אלגוריתמי כמה שאפשר לפני הכתיבה בפועל. 
 

קישור לתוכן
שתף באתרים אחרים

ציטוט של exeaction

לא מומחה לג'אווה אבל מכיר מבני נתונים ובכללי זו שאלה של אלגוריתמקיה (בגלל זה יש הרבה "אסור") אז אתן את השנקל שלי.


נניח ויש לך 3 מחסניות (זה first in last out?) מחסנית אחת הנתונה, ועוד 2 עזר StackIn, StackA, StackB
תבחר כיוון שרירותי ממנו עבורו תחפש רצף (אחדות, עשרות מאות וכו' למשל) ותתחיל לבדוק את הראש ובמידה ואין שיוון בין ספרת האחדות לראש, שפוך מIn ל-A. 
במידה ותמצא איבר בIn שתואם לספרת האחדות של הנתון, כעת תתחיל לשפוך איברים לB במקום A. 
כעת יש 2 מקרים, 1 שמצאת רצף וסיימת. 2 - אין שיוון באחד מהספרות ולכן אתה צריך לשפוך הכל מB חזרה לIn, ואת אותה הספרה שממנה בדקת אם מתחיל רצף לשפוך שוב לA ולהמשיך כך עם האיבר שאחריו.

עכשיו יתכן שמחסנית A תתמלא ולא תמצא רצף בגלל שבדקת בכיוון הלא נכון, אבל מה טוב, המסנית A היא בדיוק הפוכה מIn ולכן אתה יכול לעשות את אותן הפעולות כמו קודם, רק שתתחיל לבדוק ולשפוף מA לIn.

מקווה שמספיק מובן.
ממליץ לך לתרגם את הטקסט לכתיב אלגוריתמי כמה שאפשר לפני הכתיבה בפועל. 
 

 

קישור לתוכן
שתף באתרים אחרים

ציטוט של exeaction

לא מומחה לג'אווה אבל מכיר מבני נתונים ובכללי זו שאלה של אלגוריתמקיה (בגלל זה יש הרבה "אסור") אז אתן את השנקל שלי.


נניח ויש לך 3 מחסניות (זה first in last out?) מחסנית אחת הנתונה, ועוד 2 עזר StackIn, StackA, StackB
תבחר כיוון שרירותי ממנו עבורו תחפש רצף (אחדות, עשרות מאות וכו' למשל) ותתחיל לבדוק את הראש ובמידה ואין שיוון בין ספרת האחדות לראש, שפוך מIn ל-A. 
במידה ותמצא איבר בIn שתואם לספרת האחדות של הנתון, כעת תתחיל לשפוך איברים לB במקום A. 
כעת יש 2 מקרים, 1 שמצאת רצף וסיימת. 2 - אין שיוון באחד מהספרות ולכן אתה צריך לשפוך הכל מB חזרה לIn, ואת אותה הספרה שממנה בדקת אם מתחיל רצף לשפוך שוב לA ולהמשיך כך עם האיבר שאחריו.

עכשיו יתכן שמחסנית A תתמלא ולא תמצא רצף בגלל שבדקת בכיוון הלא נכון, אבל מה טוב, המסנית A היא בדיוק הפוכה מIn ולכן אתה יכול לעשות את אותן הפעולות כמו קודם, רק שתתחיל לבדוק ולשפוף מA לIn.

מקווה שמספיק מובן.
ממליץ לך לתרגם את הטקסט לכתיב אלגוריתמי כמה שאפשר לפני הכתיבה בפועל. 
 

אחרי שקראתי את הקוד שעובד חלקית, הבנתי שניסיתי לעשות משהו מאוד דומה.
הבעיה בקוד שלך שאתה לא מטפל טוב במקרים בהם האיבר שעומד בראש המחסנית לא שווה לספרה שאתה בודק.
במקרה הזה אתה תרצה לסרוק שוב את המחסנית מחדש החל מהאיבר שבא אחרי האיבר הראשון שבו כן הייתה התאמה כדי  לא לדלג על רצף תקין.
כדי לעשות את זה אתה צריך להחזיר אותם בחזרה למחסנית כמו שתיארתי בהצעה שלי.
אתה יכול לעשות את זה גם באמצעות 2 מחסניות ולא שלוש כמו שתיארתי אם תוסיף משתנים שיספרו כמה איברים ייתכן ותצטרך להחזיר למחסנית.
סה"כ היית קרוב.

נערך על-ידי exeaction
קישור לתוכן
שתף באתרים אחרים

ציטוט של maor18

התייאשתי, שבוע שלם להגשה ופשוט נתקעתי. 5 תרגילים, 4 עשיתי ואחד פשוט לא מצליח. אשמח שתעזרו לי.

התרגיל הוא:
כתבו פונקציה חיצונית המקבלת כפרמטר מספר שלם חיובי ומחסנית של ספרות.
על הפונקציה להחזיר true אם ספרות של המספר מופיעות ברצף במחסנית בסדר
כלשהו ו- false אחרת.

איך לעזאזל אני עושה את זה? אני נשברתי כבר נפשית, ניסיתי הכל מהכל.

 

הקוד שלי נראה משהו כזה:











Stack<Integer> temp = new Stack<Integer>();
		int x = num;
		
		boolean flag = false;
		while (!s.isEmpty()) {
			if (s.top() == x % 10) {
				temp.push(s.pop());
				x /= 10;
				if (x == 0)
					flag = true;
			} else {
				temp.push(s.pop());
				x = num;
			}
		}
		x = num;
		while (!temp.isEmpty()) {
			if (temp.top() == x % 10) {
				s.push(temp.pop());
				x /= 10;
				if (x == 0)
					flag = true;
			} else {
				s.push(temp.pop());
				x = num;
			}

		}
		return flag;

 

לא יודע מה הציעו לך, לא קראתי, אבל הכי פשוט ומהיר זה להשתמש בטבלה/מערך מאופס בגודל עשר, לעשות למספר מודולו עשר ולעשות פלוס אחד כל פעם במקום של הספרה שקיבלת. תחלק את המספר בעשר ותמשיך.

 

ואז פשוט להוציא ספרה ספרה מהסטאק ולהוריד באחד במקום המתאים בטבלה. אם סיימת את המספר בלי לנסות לעשות מינוס אחד לאפס אז תחזיר true . אולי צריך להעתיק את הטבלה כמה פעמים ולחזור על התהליך עד שהסטאק מתרוקן ולהחזיר false תלוי בתנאים של הבעיה ובגודל הסטאק.

 

זה קוד של איזה חמש שש שורות.

 

יאללה נו, לא כתבתי כבר כמה שנים בג'אווה אז ברשותך אכתוב את הקוד בC, לא טרחתי לקמפל אבל זה לא באמת משנה זה האלגוריתם וזו כבר המשימה שלך:

bool is_digit_in_stack(stack digits, unsigned int number)
{
    int digit_array[10] = {0};
    int digit_array_copy[10] = {0};  
    int number_digits = 0;
    int stack_digits = 0;

	while(number){
		++digit_array[number%10];
        number/=10;
        ++number_digits;
    }
 
	
    while(!digits.is_empty()){
    	memcopy(digit_array_copy, digit_array, 10);
        stack_digits = 0;
        
    	while(digit_array_copy[digits.top()]){
        	--digit_array_copy[digits.pop()];//I assume that pop returns the leading number
            ++stack_digits;
        }
        if(digits.is_empty() && number_digits == stack_digits){
        	return true;
        } else if (digits.is_empty() {
        	return false;
        }
    }

}

שים לה שהwhile(!digits.is_empty()) בהתחלה יכול להיות גם while(True) אבל המתרגלים שמלמדים באקדמיה לא אוהבים את צורת הכתיבה הזאת ומורידים עליה משום מה אז העדפתי לכתוב כך.

נערך על-ידי Buck
קישור לתוכן
שתף באתרים אחרים

ציטוט של Buck

לא יודע מה הציעו לך, לא קראתי, אבל הכי פשוט ומהיר זה להשתמש בטבלה/מערך מאופס בגודל עשר, לעשות למספר מודולו עשר ולעשות פלוס אחד כל פעם במקום של הספרה שקיבלת. תחלק את המספר בעשר ותמשיך.

 

ואז פשוט להוציא ספרה ספרה מהסטאק ולהוריד באחד במקום המתאים בטבלה. אם סיימת את המספר בלי לנסות לעשות מינוס אחד לאפס אז תחזיר true . אולי צריך להעתיק את הטבלה כמה פעמים ולחזור על התהליך עד שהסטאק מתרוקן ולהחזיר false תלוי בתנאים של הבעיה ובגודל הסטאק.

 

זה קוד של איזה חמש שש שורות.

 

יאללה נו, לא כתבתי כבר כמה שנים בג'אווה אז ברשותך אכתוב את הקוד בC, לא טרחתי לקמפל אבל זה לא באמת משנה זה האלגוריתם וזו כבר המשימה שלך:


bool is_digit_in_stack(stack digits, unsigned int number)
{
    int digit_array[10] = {0};
    int digit_array_copy[10] = {0};  
    int number_digits = 0;
    int stack_digits = 0;

	while(number){
		++digit_array[number%10];
        number/=10;
        ++number_digits;
    }
 
	
    while(!digits.is_empty()){
    	memcopy(digit_array_copy, digit_array, 10);
        stack_digits = 0;
        
    	while(digit_array_copy[digits.top()]){
        	--digit_array_copy[digits.pop()];//I assume that pop returns the leading number
            ++stack_digits;
        }
        if(digits.is_empty() && number_digits == stack_digits){
        	return true;
        } else if (digits.is_empty() {
        	return false;
        }
    }

}

 

כמובן שהצענו דברים דומים! אסור :(

ציטוט של Buck

שים לה שהwhile(!digits.is_empty()) בהתחלה יכול להיות גם while(True) אבל המתרגלים שמלמדים באקדמיה לא אוהבים את צורת הכתיבה הזאת ומורידים עליה משום מה אז העדפתי לכתוב כך.

שעות התווכחתי עם המתרגל וגם עם המרצה, בסוף הם השתכנעו (אגב, אותו דבר על goto. ולא שהשתמשתי בgoto בתקופת הלימודים).

קישור לתוכן
שתף באתרים אחרים

אני חושב שהאיסור הוא על שימוש בכלים מורכבים של השפה שהוא לא למד עליהם ולא במבנה פשוט כמו מערך.

 

goto בסי היא אחלה לניקיון משאבים, אלא אם המתרגלים/המרצים חושבים שהם מבינים בכתיבת קוד יותר מליינוס טריבלדס והכותבים של ...

 

נערך על-ידי Buck
קישור לתוכן
שתף באתרים אחרים

ציטוט של Buck

אני חושב שהאיסור הוא על שימוש בכלים מורכבים של השפה שהוא לא למד עליהם ולא במבנה פשוט כמו מערך.

אני הבנתי שהאיסור הוא על שימוש בכל דבר שלא יגרור פתרון בעזרת מחסניות.

 

ציטוט של Buck

goto בסי היא אחלה לניקיון משאבים, אלא אם המתרגלים/המרצים חושבים שהם מבינים בכתיבת קוד יותר מליינוס טריבלדס והכותבים של לינוקס...

לא רק הוא, גם עוד כמה מהשמות הגדולים...

וזהו, זו בדיוק הבעיה, שזה מה שהם חושבים (גם אם לא אומרים את זה).

אגב, אומרים טורבלדס (torvalds).

נערך על-ידי af db creid
קישור לתוכן
שתף באתרים אחרים

הצטרפ/י לדיון

בשלב זה תוכל/י להצטרף לדיון, ולאחר מכן להצטרף לקהילה שלנו. אם כבר יש לך חשבון אצלנו, אנא התחבר/י עכשיו על מנת להגיב תחת שם המשתמש שלך.
לתשומת לבך: התגובה תופיע לגולשים לאחר אישור של צוות הנהלת הפורומים.

אורח
הוסף תגובה

×   התוכן שהודבק הוא עם עיצוב.   הסר עיצוב

  Only 75 emoji are allowed.

×   הקישור שלך הוטמע אוטומטית.   הצג כקישור רגיל

×   התוכן הקודם שלך שוחזר אוטומטית.   נקה הכל

×   You cannot paste images directly. Upload or insert images from URL.

 Share

×
  • צור חדש...