Menu
Coddy logo textTech

סיכום – אוסף גנרי

חלק מהיחידה תכנות מונחה עצמים במסלול ה-GO של Coddy. שיעור 72 מתוך 107.

challenge icon

אתגר

קל

בואו נבנה מבנה נתונים גנרי של תור שמדגים את כל מה שלמדת על גנריות ב-Go! בניגוד למחסנית (LIFO), תור פועל לפי הסדר ראשון נכנס, ראשון יוצא (FIFO): הפריט הראשון שנוסף הוא הראשון שמוסר.

תארגן את הקוד שלך בשני קבצים:

  • queue.go: הגדר את אוסף התור הגנרי שלך.

    צור מבנה גנרי Queue[T any] ששומר פריטים באופן פנימי. התור שלך צריך לתמוך בפעולות הבאות:

    • Enqueue(item T) - מוסיפה פריט לסוף התור
    • Dequeue() (T, bool) - מסירה ומחזירה את הפריט שבראש התור, יחד עם ערך בוליאני שמציין הצלחה (החזר את ערך האפס ואת false אם התור ריק)
    • Peek() (T, bool) - מחזירה את הפריט שבראש התור בלי להסיר אותו (אותה תבנית החזרה כמו ב-Dequeue)
    • Size() int - מחזירה את מספר הפריטים בתור
    • IsEmpty() bool - מחזירה true אם אין פריטים בתור

    צור גם פונקציית בנאי NewQueue[T any]() *Queue[T] שמחזירה מצביע לתור ריק ומאותחל.

  • main.go: הדגם את התור שלך עם טיפוסים שונים בהתאם לקלט.

    קרא סמן טיפוס (int או string), ואז קרא סדרת פקודות לביצוע בתור. כל פקודה מופיעה בשורה נפרדת:

    • enqueue [value] - הוסף את הערך לתור
    • dequeue - הסר והדפס את הפריט שבראש התור (הדפס empty אם התור ריק)
    • peek - הדפס את הפריט שבראש התור בלי להסיר אותו (הדפס empty אם התור ריק)
    • size - הדפס את הגודל הנוכחי

    קרא פקודות עד שמתקבלת done.

הקלטים הבאים יסופקו:

  • שורה 1: סמן טיפוס (int או string)
  • השורות הבאות: פקודות עד done

לדוגמה, בהינתן:

int
enqueue 10
enqueue 20
enqueue 30
peek
dequeue
size
dequeue
dequeue
dequeue
done

הפלט שלך צריך להיות:

10
10
2
20
30
empty

ובהינתן:

string
enqueue hello
enqueue world
size
peek
dequeue
peek
done

הפלט שלך צריך להיות:

2
hello
hello
world

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

נסו בעצמכם

package main

import (
	"bufio"
	"fmt"
	"os"
	"strconv"
	"strings"
)

func main() {
	scanner := bufio.NewScanner(os.Stdin)
	
	// קרא את מציין הסוג
	scanner.Scan()
	typeIndicator := scanner.Text()
	
	if typeIndicator == "int" {
		// TODO: צור תור של מספרים שלמים באמצעות NewQueue[int]()
		// עבד פקודות עבור תור המספרים השלמים
		
		for scanner.Scan() {
			line := scanner.Text()
			if line == "done" {
				break
			}
			
			parts := strings.SplitN(line, " ", 2)
			command := parts[0]
			
			// TODO: טפל בפקודות: enqueue, dequeue, peek, size
			// עבור enqueue, המר את הערך ב-parts[1] למספר שלם
			// עבור dequeue/peek, הדפס "empty" אם התור ריק
			_ = command
		}
	} else if typeIndicator == "string" {
		// TODO: צור תור של מחרוזות באמצעות NewQueue[string]()
		// עבד פקודות עבור תור המחרוזות
		
		for scanner.Scan() {
			line := scanner.Text()
			if line == "done" {
				break
			}
			
			parts := strings.SplitN(line, " ", 2)
			command := parts[0]
			
			// TODO: טפל בפקודות: enqueue, dequeue, peek, size
			// עבור enqueue, השתמש בערך המחרוזת מתוך parts[1]
			// עבור dequeue/peek, הדפס "empty" אם התור ריק
			_ = command
		}
	}
	
	// אלה נמצאים כאן כדי למנוע שגיאות של ייבואים שאינם בשימוש במהלך הפיתוח
	_ = strconv.Atoi
	_ = fmt.Println
}

כל השיעורים ביחידה תכנות מונחה עצמים

תרגלו בעצמכם: קומפיילר Go אונליין