โครงสร้างข้อมูลแบบสแตก (stack)

Slides:



Advertisements
งานนำเสนอที่คล้ายกัน
อสมการเชิงเส้นตัวแปรเดียว
Advertisements

การใช้งานโปรแกรม SPSS
หน่วยที่ 3 ภาษาคำสั่งพื้นฐานที่ใช้เขียนโปรแกรม PLC
ซอฟต์แวร์ระบบที่รู้จักกันดี คือซอฟต์แวร์ควบคุมการปฏิบัติการ ของคอมพิวเตอร์ที่เรียกว่า ระบบปฏิบัติการ ระบบปฏิบัติการเป็นชุดคำสั่งที่ใช้ควบคุมระบบฮาร์ดแวร์และ.
หน่วยการเรียนรู้ที่ 2 หลักการแก้ปัญหาด้วยคอมพิวเตอร์
Pushdown Automata : PDA
กาญจนา ทองบุญนาค สาขาวิชาคอมพิวเตอร์ คณะวิทยาศาสตร์และเทคโนโลยี
กระบวนการของการอธิบาย
พยาบาลวิชาชีพชำนาญการพิเศษ
ตัวแปร และชนิด ข้อมูล. ตัวแปร การกำหนดตัวแปรเป็นการใช้ ชื่อตัวแปรแทน ตำแหน่งบนหน่วยความจำ สำหรับเก็บ ข้อมูลระหว่างการ ประมวลผล ซึ่งอาจเป็นข้อมูลนำเข้า.
ครั้งที่ 7 รีจิสเตอร์ (REGISTER). รีจิสเตอร์ (Register) รีจิสเตอร์เป็นวงจรความจำที่ใช้ในการเก็บค่า ทางไบนารี่ ใช้ในการเก็บค่าในระหว่างการ ประมวลผลโดยใช้ฟลิป.
MEE 231 Computer Programming สัปดาห์ที่ 6 ภาษา C หลักการของโปรแกรม ชนิดของตัวแปร การดำเนินการ คำสั่งการรับค่าตัวแปร และการแสดงผล.
Intro Excel 2010 ข้อมูลจาก... ellession1.htm.
หน่วยที่ 1 เรื่อง การใช้โปรแกรมตารางงานนำเสนอข้อมูล สาระสำคัญ โปรแกรม Microsoft Excel เป็นโปรแกรมที่ สามารถช่วยในเรื่องการคำนวณทั้งการบวก การลบ การคูณ.
การพัฒนาบทเรียนคอมพิวเตอร์ช่วยสอน เรื่อง หลักการทำงานของคอมพิวเตอร์ วิชาคอมพิวเตอร์พื้นฐาน สำหรับนักเรียนชั้นมัธยมศึกษาปีที่ 1 โรงเรียนเฉลิมราชประชาอุทิศ.
LOGO ภาษาซี 1.1 อ. กฤติเดช จินดาภัทร์. LOGO ตัวอย่างโค้ดภาษาซี
คำสั่งควบคุมการทำงาน
Project Management by Gantt Chart & PERT Diagram
ผังงาน..(Flow Chart) หมายถึง...
เกม คณิตคิดเร็ว.
stack #2 ผู้สอน อาจารย์ ยืนยง กันทะเนตร
บทที่ 1 สถาปัตยกรรมของระบบฐานข้อมูล (Database Architecture)
สมการเชิงเส้น (Linear equation)
STACK สแตก(stack) เป็นโครงสร้างข้อมูลแบบเชิงเส้น ที่มีการใส่ข้อมูลเข้า และนำข้อมูลออกเพียงด้านเดียว ดังนั้น ข้อมูลที่เข้าไปอยู่ใน stack ก่อนจะออกจาก stack.
BC320 Introduction to Computer Programming
โครงสร้างภาษา C Arduino
บทที่ 1 ความรู้ทั่วไปเกี่ยวกับคอมพิวเตอร์
การบัญชีต้นทุนช่วง (Process Costing).
QUEUE คิวจะมีโครงสร้างแบบเชิงเส้นเหมือน stack แต่แตกต่างตรงที่ queue มีตัวชี้ 2 ตัวคือ หัว(Head) และหาง(Tail) โดยการใส่ข้อมูลเข้าและนำข้อมูลออก จะมีลักษณะ.
บทที่ 7 การเขียนโปรแกรม แบบวนรอบทำซ้ำ (Loop)
เซต (SET) ประวัติย่อของวิชาเซต ความหมายของเซต การเขียนแทนเซต
บทที่ 1 ระบบสารสนเทศ (Information System)
บทที่ 3 แฟ้มข้อมูลและฐานข้อมูล
บัตรยิ้ม สร้างเสริมกำลังใจ
ความรู้เบื้องต้นเกี่ยวกับคอมพิวเตอร์และเทคโนโลยีสารสนเทศ
ขั้นตอนการออกแบบ ผังงาน (Flow Chart)
การเขียนโปรแกรมแบบวนซ้ำ: คำสั่ง while คำสั่ง do….while
วิธีการกำหนดค่า Microsoft SharePoint ของคุณ เว็บไซต์ออนไลน์
Data storage II Introduction to Computer Science ( )
การประชุมเชิงปฏิบัติการพัฒนาศักยภาพบุคลากรทางการศึกษาด้านการสอบด้วยคอมพิวเตอร์ (Computer-based Assessment) การรู้เรื่องการอ่าน ด้านคณิตศาสตร์และด้านวิทยาศาสตร์
บริษัท พัฒนาวิชาการ (2535) จำกัด
บทที่ 9 การทำซ้ำ (Loop).
อาจารย์อภิพงศ์ ปิงยศ Lab 06 : Microsoft Excel (Part2) ทท101 เทคโนโลยีสารสนเทศและนวัตกรรมการสื่อสารทางการท่องเที่ยว อาจารย์อภิพงศ์
บทที่7 ทฤษฎีกราฟเบื้องต้น
ผู้ช่วยศาสตราจารย์จุฑาวุฒิ จันทรมาลี
วัฏจักรหิน วัฏจักรหิน : วัดวาอาราม หินงามบ้านเรา
การสร้างแบบสอบถาม และ การกำหนดเงื่อนไข.
Data storage II Introduction to Computer Science ( )
บรรยายครั้งที่ 8 - กราฟฟิกวิศวกรรม 1
BASIC STATISTICS MEAN / MODE / MEDIAN / SD / CV.
บทที่ 9 การเรียงลำดับข้อมูล (Sorting)
บทที่ 7 การประมวลผลอาร์เรย์
บทที่ 8 การแก้ไขข้อผิดพลาดโปรแกรม(Debugging)
สถาปัตยกรรมของฐานข้อมูล
Tree.
OPERATOR ภาษาปาสคาล (Pascal)
ค่ารูรับแสง - F/Stop ค่ารูรับแสงที่มีค่าตัวเลขต่ำใกล้เคียง 1 มากเท่าไหร่ ค่าของรูรับแสงนั้นก็ยิ่งมีความกว้างมาก เพราะเราเปรียบเทียบค่าความสว่างที่ 1:1.
ตัวแบบมาร์คอฟ (Markov Model)
2 โครงสร้างข้อมูลแบบสแตก (STACK).
3 โครงสร้างข้อมูลแบบคิว (QUEUE).
บทที่ 2 โครงสร้างข้อมูลแบบแถวลำดับหรืออาร์เรย์ (Array)
Chapter 3 : Array.
การสเก็ตภาพสามมิติ(Three-Dimensional Pictorials )
การเขียนโปรแกรมด้วยภาษาไพทอน การเขียนโปรแกรมแบบทางเลือก
บทที่ 5 พัลส์เทคนิค
โครงการถ่ายทอดเทคโนโลยีถนนรีไซเคิลเพื่อลดขยะพลาสติกใน 4 ภูมิภาค
ทายสิอะไรเอ่ย ? กลม เขียวเปรี้ยว เฉลย ทายสิอะไรเอ่ย ? ขาว มันจืด เฉลย.
Decision: Single and Double Selection (if and if-else statement)
การวิเคราะห์สถานะคงตัวของ วงจรที่ใช้คลื่นรูปไซน์
กระดาษทำการ (หลักการและภาคปฏิบัติ)
ใบสำเนางานนำเสนอ:

โครงสร้างข้อมูลแบบสแตก (stack)

ลักษณะโครงสร้างของแสตก ลักษณะโครงสร้างข้อมูลแบบสแตก เป็นลักษณะโครงสร้างขัอมูลแบบบัญชีรายการเชิงเส้น(linear list)ซึ่งจะมีการปฏิบัติงานต่าง ๆ เช่น การนำสมาชิกเข้ามาเพิ่มในบัญชีรายการ หรือการนำสมาชิกใดสมาชิกหนึ่งออกจากบัญชีรายการ จะต้องกระทำในทิศทางเดียวกันเสมอ และจะต้องกระทำที่ปลายเพียงด้านเดียวเท่านั้น

ดังนั้นลักษณะของแสตกจะเหมือนกับที่ถาดซึ่งมีลักษณะดังนี้ Top tray of pile Stacked trays spring

การเก็บข้อมูลในโครงสร้างแบบ STACK และการดึงข้อมูลมาใช้งานในลักษณะของสแตกจะเป็นลักษณะที่เรียกว่า lifo (last - in, first - out) คือสิ่งที่ถูกเก็บที่หลังสุดจะถูกดึงมาทำงานก่อน ดังนั้นถ้าให้ s เป็นบัญชีรายการเชิงเส้นซึ่งมีสมาชิกเป็น a1,a2,…,an ลักษณะของบัญชีรายการเชิงเส้นนี้จะถูกเก็บในสแตกดังนี้ insert delete an Top element of stack a3 a2 a1

ในการปฏิบัติงานกับลักษณะโครงสร้างข้อมูลแบบสแตกนั้น เราจะสนใจในลักษณะของ 1. การนำสมาชิกใหม่เข้าไปเก็บเพิ่มในสแตก (insertion) ในลักษณะการนำสมาชิกเข้าไปเก็บเพิ่มในสแตกนั้นจะสามาระนำไปเก็บเพิ่มเติมได้ทีละ 1 สมาชิกนั้น ซึ่งการเพิ่มสมาชิกเข้ามานี้เราจะเรียกว่า การ push stack 2. การนำสมาชิกออกจาก stack (deleteion) เป็นการนำสมาชิกออกจากสแตก ซึ่งการนำสมาชิกที่อยู่ตัวบนสุดของ stack เท่านั้น การนำสมาชิกออกจากสแตกนั้นจะเรียกว่า การ pop stack

ถ้าเรามองการเก็บข้อมูลแบบสแตกโดยใช้ตัวแปรแถวอันดับก็จะเหมือนกับตัวแปรแถวอันดับนั้นมีรอบด้าน และทำงานได้เพียงด้านเดียว ซึ่งการนำค่ามาเพิ่มหรือการเอาค่าออกไปจะทำได้เฉพาะตัวที่อยู่บนสุดเท่านั้น ดังนั้นถ้าให้ตัวแปรแถวอันดับ s(1:n) แทนลักษณะของสแตก จำนวนสมาชิกที่สูงที่สุดในสแตกนี้คือ n จำนวน ถ้าให้ top เป็นดัชนีกำกับ (subscript) ที่ทำหน้าที่ชี้สมาชิกด้วยที่อยู่บนสุดของสแตกซึ่งจะเป็นสมาชิกตัวที่ถูกทำงานต่าง ๆ ดังนั้นถ้าในสแตกไม่มีค่าอะไร ซึ่งจะเรียกว่า empty stack ค่าของ top ก็จะเท่ากับศูนย์ และค่าสูงสุดของ top ก็จะมีค่าเท่ากับสูงสุดของความสามารถของสแตกที่จะเก็บค่าไว้ได้ ซึ่งเรียกว่า stack capacity

การประยุกต์ใช้สแตก (application of stack) ในการนำสแตกมาประยุกต์ใช้นั้นจริง ๆ แล้วสแตกสามารถนำมาประยุกต์ใช้กับงานทางด้านคอมพิวเตอร์ได้เป็นจำนวนมาก แต่ในที่นี้จะอธิบายให้เห็นชัดเจนถึงประโยชน์ของการนำเอาสแตกมาใช้งาน 2 อย่างคือ 1. Recursion 2. Infix และ postfix notation

Recursion เป็นเทคนิคของการแก้ปัญหาของเซทหรือของการประมวลผล โดยใช้การเรียกตัวเองมาใช้งาน ดังนั้น recursion procedure จะหมายถึง ส่วนของโปรแกรมที่สร้างขึ้นมาแล้วสามารถเรียกตัวเองมาใช้ได้ ซึ่งในทางคอมพิวเตอร์จะพบลักษณะของการเรียกตัวเองมาใช้งานหลาย ๆ อย่าง เพื่อทำให้การทำงานนั้น ๆ สะดวกและง่ายขึ้น ดังนั้นในภาษาคอมพิวเตอร์บางภาษาจึงมีลักษณะการเขียนโปรแกรมแบบเรียกใช้ตัวเองได้ เช่น ภาษา pl/1, pascal, algol และ snoblo4 ในการเขียน recursive rpeceddure ใด ๆ จำเป็นจะต้องมีเงื่อนไขที่สำคัญ 2 ประการคือ 1. ในการเรียกตัวเองใช้จะต้องเรียกตัวเองที่อยู่ใกล้ที่สุดก่อน 2. จะต้องมีกฏเกณฑ์ที่แน่นอนว่าการประมวลผลจะทำไปถึงจุดใดจึงจะหยุดการทำงาน

Infix & postfix notation เป็นเรื่องของการใช้เครื่องหมายในลักษณะที่เป็นรูป infix และ postfix ซึ่งก่อนศึกษาการใช้เครื่องหมายทั้ง 2 อย่างนี้ ควรกลับมาทบทวนเรื่องนิพจน์คณิตศาสตร์ (artthmetic expression) นิพจน์ (expression) คือการนำเอาตัวแปรและค่าคงที่มาสัมพันธ์กัน โดยมีเครื่องหมายคำนวณเป็นตัวเชื่อมก็เรียกนิพจน์คณิตศาสตร์ (arithemtic expression) ถ้าตัวแปรและค่าคงที่มาสัมพันธ์กันโดยมีเครื่องหมายเปรียบเทียบ หรือเครื่องหมายตรรกะเป็นตัวเชื่อมก็เรียกนิพจน์ตรรกะ (logical expression) ในการศึกษาเรื่อง infix และ postfix นี้เราจะสนใจแต่นยิพจน์คณิตศาสตร์ซึ่งมีเครื่องหมายที่ใช้เป็นตัวเชื่อมคือ 1. ยกกำลัง (**) 2. คูณกับหาร (* กับ /) 3 บวกกับลบ (+ กับ -)

Postfix notation เป็นลักษณะของการเขียนนิพจน์คณิตศาสตร์ซึ่งมีรูปแบบคือ operand operator operand คือเครื่องหมายอยู่ระหว่างตัวแปรหรือค่าคงที่นั่นเอง ซึ่งได้แก่นิพจน์คณิตศาสตร์ในภาษาระดับสูงทั่ว ๆ ไปของคอมพิวเตอร์นั่นเอง เช่น a + b operand operator operand

เราสนใจในเรื่องการหาค่าของนิพจน์คณิตศาสตร์ที่อยู่ในลักษณะที่เป็น infixnotation การหาค่าของนิพจน์โดยปกติจะต้องทำจาก ซ้ายไปขวา เสมอ โดยมีลำดับความสำคัญของเครื่องหมายจากมากที่สุดไปหาน้อยที่สุด ดังนี้ 1 ** (ยกกำลัง) 2 * กับ / 3 + กับ - ในกรณีที่มีวงเล็บจะทำภายในวงเล็บในสุดก่อน และทำจากซ้ายไปขวาโดยทีลำดับของเครื่องหมายเช่นกัน ยกเว้นในกรณีที่นิพจน์ที่มีเครื่องหมายกำลังล้วน ๆ จะทำจากขวามาซ้าย

Postrix notation เป็นลักษณะของการเขียนนิพจน์คณิตศาสตร์ที่มีรูปแบบการเขียนดังนี้คือ operand poerand operation ลักษณะที่สำคัญของนิพจน์แบบ postfix คือ 1. เครื่องหมายทุกตัวจะต้องอยู่ข้างหลังตัวกระทำ (operand) 2 ตัวเสมอ 2. เครื่องหมายทุกตัวจะถูกวางอยู่ในลำดับที่ถูกต้องในการปฏิบัติงาน คือ เครื่องหมายใดที่จะทำเป็นตัวแรกจะถูกวางไว้ในอันดับที่ 1 เครื่องหมายที่จะทำตัวที่ 2 ก็จะถูกวางไว้เป็นอันดับที่ 2 และวางต่อ ๆ กันไปเช่นนี้จนจบ 3. ไม่มีเครื่องหมายวงเล็บในนิพจน์

จากลักษณะของ postfix จะพบว่าการหาค่าของนิพจน์ที่อยู่ในรุป postfix นั้นจะช่วยลดปัญหาที่สำคัญ 2 ประการคือ 1. ลดความยุ่งยากในการใส่วงเล็บเพื่อแสดงลำดับการทำงานก่อนหลังของเครื่องหมาย 2. ลดปัญหาตรวจดูและลำดับการทำงานของเครื่องหมาย ในการเขียนนิพจน์คณิตศาสตร์ด้วยภาษาระดับสูงใด ๆ เรามักจะเขียนอยู่ในรูปของ infix form แต่เมื่อคอมพิวเตอร์ทำนิพจน์นั้น ๆ มันจะเปลี่ยนนิพจน์ที่อยู่ในรูป infix form ให้อยู่ในรูป postfic form ก่อนแล้วทำการทำงานตามนิพจน์ในรูป postfix form จนได้ผลลัพธ์

ดังนั้น เราจึงต้องศึกษาวิธีการเปลี่ยนจาก infix form เป็น postfix form 2. พิจารณาวงเล็บในสุดออกมาโดยเอา operator ที่อยู่ระหว่าง operand มาแทนวงเล็บปิดของวงเล็บนั้น ๆ 3. เมื่อแทนวงเล็บปิดด้วยเครื่องหมายจนหมดแล้วให้เอาวงเล็บเปิดออกทิ้งไปให้หมด

วิธีเปลี่ยน infix form เป็น postfix form โดยใช้สแตก จะเห็นว่า infix form เป็น postfix form นั้นลำดับของ operand ไม่เปลี่ยนแปลง แต่ลำดับของเครื่องหมาย (operator) จะเปลี่ยนแปลง ดังนั้นถ้าจะใช้วิธีการของสแตกมาช่วนในการเปลี่ยนจาก infix เป็น postfix นั้นค่าเราสนใจจะนำมาเก็บในสแตกราวเป็นเครื่องหมาย จะเห็นว่าในการเปลี่ยน infix form เป็น postfix form นั้น priority ของเครื่องหมายจะสำคัญโดยจะพิจารณา pririty ของเครื่องหมายเป็น 2 แบบคือ 1. Priority ของเครื่องหมายที่อยู่ใน stack เราเรียกว่า in stack priority จะใช้ตัวย่อว่า isp 2. Priority ของเครื่องหมายที่กำลังจะถูกนำลงสู่ stack เราเรียกว่า in coming priority จะใช้ตัวย่อว่า icp

การกำหนด isp และ icp จะใช้หลักที่ว่า operator ที่มี priority สูงก็จะมี isp และ icp สูงกว่า operator ที่มี priority ต่ำกว่า และ operator ที่จะถูก push ลงสู่ stack ได้จะต้องมีค่า icp isp

ดังนั้นถ้าเราให้ isp และ icp ของเครื่องหมายต่าง ๆ ดังนี้ Symbol isp icp ( 0 4 ** 4 4 * 2 2 / 2 2 + 1 1 - 1 1 ) - - empty stack - --

เราจะสามารถสร้าง procedure ในการเปลี่ยน infix form ให้เป็น postfix form ได้โดยถ้าให้ next-token เป็น procedure ซึ่งทำหน้าที่ส่งค่าของแต่ละ token ใน infix form มาให้เราในแต่ละครั้งที่มีการเรียก เช่น ถ้า infix เป็น a+b*c ในการเรียกแต่ละครั้งจะได้ token ดังนี้ Token = next - next (infix) นั่นคือ ถ้าเรียกครั้งแรก token = a และ token = next - token (infix) ถ้าเรียกครั้งที่ 2 token = + ถ้าเรียกครั้งที่ 4 token = * ถ้าเรียกครั้งที่ 3 token = b ถ้าเรียกครั้งที่ 6 token = c

วิธีหาค่าของ postfix expression จะหาได้โดยทำตามขั้นตอนต่อไปนี้ตามลำดับ 1. หาตัว operator ตัวซ้ายสุดของ expression 2. เลือก operand 2 ตัวที่อยู่ติดทางซ้ายของ operator นั้น 3. ให้เอา operand ที่เลือกได้ข้อ 2 ตัวซ้ายเป็นตัวตั้ง แล้วนำเอาเครื่องหมายที่เลือกได้ในข้อ 1 มาเป็นเครื่องหมายคำนวณด้วย operand ตัวที่อยู่ทางขวา 4. นำผลที่ได้ในข้อ 3 มาใส่แทนชุดที่เอาออกมาทำงานในข้อ 1 ถึง 3 แล้วเริ่มต้นทำใหม่จากข้อ 1 ถึง ข้อ 4 ทำเช่นนี้จนหมด operator ก็จะได้ผลลัพธ์ที่ต้องการ