วันพฤหัสบดีที่ 30 กรกฎาคม พ.ศ. 2552

DTS 06-29-07-2552

สรุปเนื้อหาบทเรียน "Data Structure"
เรื่อง Stack (ต่อ)

การแทนที่ข้อมูลของสแตก มี 2 วิธี คือ

การแทนที่ข้อมูลของสแตกด้วยอาร์เรย์
การแทนสแตกด้วยโครงสร้างอาร์เรย์นั้น เนื่องจากอาร์เรย์เป็นโครงสร้างที่ต้องมีการกำหนดจองพื้นที่เท่ากับขนาดที่ใหญ่ที่สุด(static) จึงจำเป็นต้องมีการกำหนดขนาดพื้นที่จัดเก็บข้อมูลสูงสุดให้เหมาะสมเมื่อมีการนำเอาข้อมูลเข้ามาก็จะนำเข้ามาจัดไว้ในอาร์เรย์แรกสุดจากนั้นจึงเรียงลำดับกันไปตามพื้นที่ที่กำหนด

การแทนที่ข้อมูลของสแตกแบบลิงค์ลิสต์
การแทนสแตกด้วยโครงสร้างแบบลิงค์ลิสต์นั้น ไม่มีข้อจำกัดของขนาดของสแตกและหน่วยความจำจะถูกใช้ก็ต่อเมื่อมีข้อมูลจริงๆ แล้วเท่านั้น ซึ่งทำให้ประหยัดเนื้อที่ในหน่วยความจำมากกว่า แต่การเขียนโค้ดสำหรับการแทนที่ข้อมูลสแตกด้วยอะเรย์ง่ายกว่าการแทนที่ข้อมูลด้วยลิงค์ลิสต์

การดำเนินงานเกี่ยวกับสแตก
1.Create Stack เป็นการสร้างสแตกขึ้นมาแล้วกำหนดค่าเริ่มต้นต่าง ๆ
2.Push Stack เป็นการนำข้อมูลมาใส่ลงในสแตก
3.Pop stack เป็นการนำข้อมูลที่อยู่บนสุดออกจากสแตก
4.Stack Top เป็นการคัดลอกข้อมูลที่อยู่บนสุดของสแตกแต่ ไม่มีการลบข้อมูลที่คัดลอกออกจากสแตก
5.Empty Stack เป็นการตรวจสอบว่าสแตกว่างหรือไม่ เพื่อไม่ให้เกิดข้อผิดพลาดที่เรียกว่า stack underflow
6.Full Stack เป็นการตรวจสอบว่าสแตกนั้นเต็มหรือไม่ เพื่อไม่ให้เกิดข้อผิดพลาดที่เรียกว่า stack overflow
7.Stack Count เป็นการนับข้อมูลในสแตกว่ามีจำนวนเท่าไหร่
8.Destroy Stack เป็นการลบข้อมูลในสแตกออกทั้งหมด

การคำนวณนิพจน์ทางคณิตศาสตร์ แบ่งเป็น 3 ประเภทคือ
1. นิพจน์ Infix คือ นิพจน์ที่มีเครื่องหมายดำเนินการ(operator)อยู่กึ่งกลางตัวถูกดำเนินการ (operand) เช่น A + B
2. นิพจน์ Postfix คือ นิพจน์ที่มีเครื่องหมายดำเนิน(operator)การอยู่ด้านหลังตัวถูกดำเนินการ (operand) เช่น AB+
3. นิพจน์ Prefix คือ นิพจน์ที่มีเครื่องหมายดำเนินการ(operator)อยู่ด้านหน้าตัวถูกดำเนินการ (operand) เช่น -AB

*** เครื่องหมายดำเนินการ (operand) ได้แก่เครื่องหมาย + - * ^ ตัวถูกดำเนินการ ได้แก่ สัญลักษณ์แทนค่าตัวเลข เช่น A B C D
หรือตัวแปรอื่น

สำหรับการดำเนินการด้านการคำนวณนั้น ในระบบคอมพิวเตอร์ไม่สามารถที่จะจัดลำดับของการคำนวณในรูปแบบของ infix ได้ แต่จะแปลงเป็นนิพจน์ของ infix หรือ prefix เสียก่อน โดยลักษณะของการแปลงนิพจน์จะใช้การเปรียบเทียบความสำคัญของตัวดำเนินการ

ลำดับความสำคัญของตัวดำเนินการ
1.เครื่องหมาย (
2.เครื่องหมาย ^
3.เครื่องหมาย * /
4.เครื่องหมาย + -
5.เครื่องหมาย )

ขั้นตอนการแปลง infix เป็น postfix
1.อ่านอักขระใน infix
2.ถ้าเป็น operand ย้ายไปใส่ใน postfix
3.ถ้าเป็น operator จะต้องดูลำดับความสำคัญของตัวดำเนินการด้วยแล้วใส่ลงในสแตกที่เก็บตัวดำเนินการ ถ้ามีค่ามากกว่าให้ push ถ้ามีค่าน้อยกว่าหรือเท่ากันให้ pop ออกแล้วไปเรียงต่อตัวอักษรใน postfix
4.ตัวดำเนินการที่เป็น ) จะไม่ถูก push แต่จะทำให้ตัวดำเนินการตัวอื่นถูก pop ออกมาแล้วไปเรียงต่อใน postfix
5.เมื่ออ่านอักขระใน infix หมด ให้ pop ตัวดำเนินการทุกตัวมาเรียงต่อใน postfix

การคำนวณค่า postfix
1.อ่านตัวอักษรจาก postfix ที่ละตัว
2.ถ้าเป็น operand ให้ push ไปเรื่อยๆ
3.ถ้าเป็น operator ให้ pop ตัวอักษรออก 2 ตัว แล้วทำการคำนวณตัวที่ถูก pop ที่หลังจะเป็นตัวตั้งแล้วนำ push ผลลัพธ์ลงไป

วันศุกร์ที่ 24 กรกฎาคม พ.ศ. 2552

DTS 05-22-07-2552

สรุปเนื้อหาบทเรียน "Data Structure"
เรื่อง Linked List และ Stack

Linked List (ต่อ)
Search list จะทำหน้าที่ค้นหาข้อมูลในลิสต์ตามที่ต้องการ

Traverse การท่องเข้าไปในลิสต์ คือ การท่องไปในทุกโหนดของลิงค์ลิสต์ เข้าถึงโครงสร้างทีละโครงสร้างที่อยู่ในลิสต์นั้น
**สมมติว่ามีลิงค์ลิสต์ H อยู่แล้ว ถ้าจะหาว่า X อยู่ในลิสต์นี้หรือไม่ เราจะสามารถรู้ได้โดยการค้นหาแบบลำดับ (sequential search) ตามลำดับ

Retrieve Node คือ การหาตำแหน่งข้อมูลในลิสต์ ว่าข้อมูลที่ต้องการนั้นอยู่ตำแหน่งที่เท่าไหร่ในลิสต์นั้น

EmptyList คือ ลิงค์ลิสต์ที่ไม่มี node อยุ่ภายใน หรือเป็นการทดสอบว่าลิสต์ว่างหรือไม่

List count คือ การนับจำนวนข้อมูลที่มีอยู่ในลิสต์ทั้งหมด ซึ่งสามารถดูค่าของจำนวนข้อมูลได้จาก Count

Destroy list คือ การทำลายลิสต์ทิ้ง โดยการลบข้อมูลในลิสต์ออกจนหมด

Linked List แบบซับซ้อน
1.Circular Linked Listหมายถึง ลิงค์ลิสต์ที่โหนดสุดท้ายสามารถวกกลับมาที่โหนดแรกได้
ใช้ประโยชน์เมื่อต้องการให้ข้อมูลมีลักษณะเป็นวนรอบหรือลูป โดยแต่ละขั้นตอนการทำงานภายในลูป จะมีการย้ายตำแหน่งของพอยน์เตอร์ไปยังโหนดถัดไป
2.Double Linked List หมายถึง ลิงค์ลิสต์ที่ทุกโหนดสามารถวกกลับมาที่โหนดก่อนหน้าของตนเองได้ ประกอบด้วยส่วนของ Info และ พอยน์เตอร์ที่ชี้ไป 2 ทิศทาง คือ ชี้ไปยังโหนดถัดไป และชี้ไปยังโหนดก่อนหน้า ดังนั้นเราจึงสามารถทำการอ่านข้อมูลได้ 2 วิธี คือ การอ่านไปข้างหน้า และอ่านไปทางข้างหลัง

Stack
สแตกเป็นลิเนียร์ลิสต์ที่มีคุณสมบัติที่ว่าเมื่อทำการเพิ่มข้อมูล หรือลบข้อมูลในสแตกจะกระทำที่ ปลายข้างเดียวกัน ปลายข้างนั้นเรียกว่า ท๊อปของสแตก (TOP OF STACK) ซึ่งมีคุณสมบัติเป็น ไลโฟลิสต์ (LIFO List) หรือพูชดาวน์ลิสต์ (Pushdown List) คือสมาชิกที่เข้าลิสต์ทีหลังสุดจะ ออกลิสต์ก่อน ตัวอย่างของสแตกที่เห็นง่าย ๆ และมักจะถูกอ้างเป็นตัวอย่างบ่อยครั้งที่สุด คือจาน ที่ตั้งซ้อนกัน เมื่อจะใช้จานก็ต้องหยิบจากใบบนสุด และถ้าจะนำจานมาไว้ก็ต้องวางทับไว้บนสุด เช่นกัน

การดำเนินงานพื้นฐานของสแตก ประกอบด้วยกระบวนการ 3 กระบวนการ
1.Push การนำข้อมูลใส่ลงไปในสแตก ซึ่งโดยปกติก่อนที่จะนำข้อมูลเก็บลงในสแตกจะต้องมีการตรวจสอบพื้นที่ในสแตกก่อน ว่ามีที่เหลือว่างให้เก็บข้อมูลได้อีกหรือไม่ การเพิ่มข้อมูลในสแตก สามารถทำได้โดยให้ทับบนข้อมูลสุดท้ายในสแตก และจะสามารถเพิ่มเข้าได้เรื่อย ๆ จนกว่าสแตกจะเต็มถ้าสแตกเต็มหรือ(Stack Overflow) จะไม่สามารถเพิ่มข้อมูลลงไปได้อีก

2.Pop การเอาข้อมูลที่อยู่บนสุดในสแตกออก ในการpop นั้นเราจะสามารถ pop ข้อมูลจากสแตกได้เรื่อย ๆ จนกว่า ข้อมูลจะหมดสแตก หรือ เป็นสแตกว่าง โดยก่อนที่จะนำข้อมูลออกจากสแตก จะต้องมีการตรวจสอบว่าใน สแตกมีข้อมูลเก็บ อยู่หรือไม่
**กรณีที่ในสแตกไม่มีข้อมูลอยู่จะทำให้เกิดข้อผิดพลาด เรียกว่า (Stack Underflow) หรือสแตกจม

3.Stack Top เป็นการคัดลอกข้อมูลในสแตก แต่ข้อมูลที่ถูกคัดลอกนั้นไม่ได้ถูกลบออกจากสแตก

**ตัวอย่างของสแตก = การว่างเก้าอี้ซ่อนกัน คือ เก้าอี้ตัวแรกจะถูกว่างไว้ข้างล่างสุดเมื่อต้องการใช้ก็ต้องดึงตัวที่อยู่บนสุดก่อนแล้วจึงจะใช้ตัวแรกที่ว่างอยู่ข้างล่างได้

การวางเหรียญซ่อนกัน คือ การวางเหรียญนั้นเหรียญแรกจะวางอยู่ล่างสุดแล้วเรียงต่อไปเรื่อยๆ การยิบเหรียญลงมาจึงต้องหยิบจากเหรียญบนสุดก่อนถึงจะหยิบเหรียญแรกได้

วันศุกร์ที่ 17 กรกฎาคม พ.ศ. 2552

DTS 04-15-07-2552

สรุปเนื้อหาบทเรียน "Data Structure"
เรื่อง Linked List

Linked List
เป็นการจัดเก็บชุดข้อมูลมีพอยเตอร์เป็นตัวเชื่อมโยงต่อเนื่องกันไปตามลำดับ
ซึ่งในลิงค์ลิสต์จะประกอบไปด้วยข้อมูลที่เรียกว่าโหนด (Node) ในหนึ่งโหนดจะประกอบด้วย
1.ส่วนของข้อมูลที่ต้องการจัดเก็บ เรียกว่าส่วน (Data)
2.ส่วนที่เป็นพอยน์เตอร์ที่ชี้ไปยังโหนดถัดไป (Link) หรือชี้ไปยังโหนดอื่นๆที่อยู่ในลิสต์

**หากโหนดแรกไม่มีข้อมูลหรือไม่มีข้อมูลในโหนดที่อยู่ถัดไป ส่วนที่เป็นพอยน์เตอร์หรือ Link จะเก็บค่า NULL เขียนแทนด้วยเครื่องหมาย กากบาท

โครงสร้างข้อมูลแบบลิงค์ลิสต์ประกอบด้วย 2 ส่วน
1.Head Structure แบ่งเป็น 3ส่วน
-count เป็นการนับจำนวนข้อมูลที่มีอยู่ในลิสต์นั้น
-pos พอยเตอร์ที่ชี้ไปยังโหนดที่เข้าถึง
-head พอยเตอร์ที่ชี้ไปยังโหนดแรกของลิสต์
2.Data Node Structure จะประกอบด้วย ข้อมูลและพอยเตอร์ที่ชี้ไปโหนดถัดไป

การเพิ่มข้อมูลลงไปในลิงค์ลิสต์นั้น จากที่ Head Structure ในส่วนของ count จะมีค่าเป็น 0 นั้นหมายถึงในลิสต์นั้นยังไม่มีข้อมูลใดเลย ส่วน head จะมีเครื่องหมายกากบาท นั้นหมายถึงในลิสต์นั้นไม่มีการเชื่อมโยงไปยังข้อมูลแรก แต่ถ้าต้องการเพิ่มข้อมูลลงไปในลิสต์ Data Node ในส่วนของข้อมูล (Data)จะมีค่าเก็บอยู่ แล้ว count ก็จะเปลี่ยนค่าจาก 0 เป็น 1 คือ การบ่งบอกถึงจำนวนข้อมูลที่มีอยู่ในลิสต์นั้น แล้ว head ก็จะชี้ไปยังข้อมูล (Data) ตัวแรกของลิสต์ ส่วนพอยเตอร์ที่ชี้ไปโหนดถัดไปจะเป็นเครื่องหมายกากบาทแทน

การลบข้อมูลในลิงค์ลิสต์ ถ้าต้องการลบข้อมูลตัวใดในลิสต์สามารถลบได้เลย แต่ต้องเปลี่ยน head เพื่อชี้ไปยังข้อมูลตัวแรกของลิสต์กรณีที่ลบข้อมูลตัวแรกออก แล้ว link คือ เมื่อลบข้อมูลตัวใดออกควรชี้ link ถัดไปให้ถูกต้องด้วย

วันศุกร์ที่ 3 กรกฎาคม พ.ศ. 2552

DTS 03-01-07-2552

สรุปเนื้อหาบทเรียน "Data Structure"
เรื่อง Pointer และ Set and String

Pointer
ตัวแปร pointer เป็นตัวแปรที่ทำหน้าที่เก็บตำแหน่งที่อยู่ของตัวแปร สามารถอ้างอิงกลับไปกลับมาได้ มีขนาด 2 ไบต์เท่ากันหมด ไม่ว่าจะเป็น char,int,floatหรืออื่นๆ

ในการประกาศตัวแปร pointer จะต้องนำหน้าด้วยเครื่องหมาย * เช่น int*x // เป็นตัวแปร pointer

เครื่องหมาย & เป็นเครื่องหมายที่บอกตำแหน่งที่อยู่ของตัวแปรที่เก็บไว้ในหน่วยความจำ

** ในกรณีที่ตัวแปรใดมีเครื่องหมาย & นำหน้าจะไม่สามารถนำมาคำนวณได้

ตัวอย่าง
int *ptr,count // เป็นการประกาศตัวแปร ptr เป็นตัวแปร pointer และประกาศตัวแปร count
count = 100 // เป็นการกำหนดค่าให้กับ count มีค่าเท่ากับ 100
ptr = &count // เป็นการกำหนดค่าให้กับ ptr มีค่าเท่ากับตำแหน่งที่อยู่ของ count

** ถ้าต้องการทราบว่า *ptr มีค่าเท่าไหร่หาได้จาก ณ ตำแหน่งที่ ptr เก็บอยู่ คือตำแหน่งที่เท่าไหร่แล้วดูว่าที่ตำแหน่งนั้นมีค่าเท่ากับเท่าไหร่

Set

เป็นโครงสร้างที่ข้อมูลแต่ละตัวไม่มีความสัมพันธ์กันเลย ตัวดำเนินการของเซ็ต ประกอบด้วย

1.set intersection

2.set union

3.set difference

String

เป็นข้อมูลที่ประกอบด้วย ตัวอักษร ตัวเลข หรือเครื่องหมายที่เรียงติดต่อกัน

ความยาวของสตริงจะถูกกำหนดโดยขนาดของสตริง ในการจองเนื้อที่นั้น ต้องทำการจองเนื้อที่ให้กับ \0 ด้วย