Stack (Push Down Stack)

Slides:



Advertisements
งานนำเสนอที่คล้ายกัน
Bansomdej Chaopraya Rajabhat University
Advertisements

โครงสร้างข้อมูลทรีและไบนารีทรี (Tree and Binary Tree)
Course Orientation Data Structure and Algorithms ( )
Stack.
Stack Holidays/seasonal content.
แถวคอย (Queue).
Data structure & Algorithms
ลักษณะการทำงานของ Stack
บรรยายครั้งที่ 3: Queue
คิวQueue Circular Queue.
Infix to Postfix มหาวิทยาลัยเนชั่น หลักการภาษาชุดคำสั่ง
โครงสร้างข้อมูลแบบคิว
คิว ลักษณะการทำงานของ Queue การดำเนินการของ Queue การตรวจสอบ Queue
สแตค(stack) โครงสร้างข้อมูลแบบ Stack - การสร้าง Stack
คิว (Queue) Queue ADT Queue เป็น List ชนิดหนึ่ง แต่สำหรับ queue การแทรกข้อมูลลงบน queue (Insertion) จะทำที่ปลายใดปลายหนึ่งของ Queue ในขณะที่การลบข้อมูลออกจากคิว.
STACK ADT By Pantharee S.. Stack Model  A list with the restriction that insertions deletions can be performed in only one position (LIFO)  Push – insert.
List ADTs By Pantharee S..
โครงสร้างข้อมูลทรีและไบนารีทรี (Tree and Binary Tree)
Linked List List is group of nodes that consists of data and link.
Advanced Class Design in Java Java Packages Week #6 Jarungjit Parnjai
กองซ้อน ยอดกองซ้อน (stack).
โครงสร้างข้อมูลแบบกองซ้อน (Stack)
Chapter 3 - Stack, - Queue,- Infix Prefix Postfix
Lecture9 Tree อ. วรวิทย์ วีระพันธุ์ เรียบเรียงโดย อ
โครงสร้างข้อมูล Queues
stack #2 ผู้สอน อาจารย์ ยืนยง กันทะเนตร
stack #1 ผู้สอน อาจารย์ ยืนยง กันทะเนตร
1.NET Framework Class อุทัย เซี่ยงเจ็น สำนักวิชาเทคโนโลยีสารสนเทศ และการสื่อสาร มหาวิทยาลัยนเรศวร วิทยาเขต สารสนเทศพะเยา.
Operator of String Data Type
การเขียนโปรแกรมภาษาปาสคาล โดยใช้โครงสร้างหลักทั้ง 3 โครงสร้าง
DATA STRUCTURE AND ALGORITHM Linked List.
Linked List (2) Sanchai Yeewiyom School of Information & Communication Technology University of Phayao.
หลักการโปรแกรม 1 Lecture 8: การทำซ้ำ (while, do-while)
Timed Math Quiz. โปรแกรมสุ่มคำนวณเลขแข่งกับ เวลา.
รศ. ดร. บุญธีร์ เครือตราชู รศ. กฤตวัน ศิริบูรณ์ KMITL Data Structures & Algorithms : Stack & Queue 1 Stack & Queue Lecturers : Boontee Kruatrachue.
Collections. Data structures Data Structures ( โครงสร้างข้อมูล ) เกิดจากการ นำข้อมูลขั้นพื้นฐานที่แบ่งแยกไม่ได้ (atomic data type) เช่น int, char, double.
QueueQueue Lecturer : Kritawan Siriboon, Room no. 913 Text : Data Structures & Algorithm Analysis in C, C++,… Mark Allen Weiss, Addison Wesley.
Linked List ( ต่อ ) Lecturer : Kritawan Siriboon, Room no. 913 Text : Data Structures & Algorithm Analysis in C, C++,… Mark Allen Weiss, Addison Wesley.
Queue Sanchai Yeewiyom School of Information & Communication Technology University of Phayao.
Queue Lecturer : Kritawan Siriboon, Room no. 913
List, Stack, Queue 2018/9/21.
เกม คณิตคิดเร็ว.
stack #2 ผู้สอน อาจารย์ ยืนยง กันทะเนตร
รายการ(List) [2] ผู้สอน อาจารย์ ยืนยง กันทะเนตร
Linked List.
Mark Allen Weiss, Addison Wesley
Queue [1] ผู้สอน อาจารย์ ยืนยง กันทะเนตร
Data Structure & Algorithm Concept
Linked List.
โครงสร้างข้อมูลและอัลกอริทึมเบื้องต้น
Stack Sanchai Yeewiyom
รายการ(List) [3] ผู้สอน อาจารย์ ยืนยง กันทะเนตร
STACK สแตก(stack) เป็นโครงสร้างข้อมูลแบบเชิงเส้น ที่มีการใส่ข้อมูลเข้า และนำข้อมูลออกเพียงด้านเดียว ดังนั้น ข้อมูลที่เข้าไปอยู่ใน stack ก่อนจะออกจาก stack.
BC320 Introduction to Computer Programming
QUEUE คิวจะมีโครงสร้างแบบเชิงเส้นเหมือน stack แต่แตกต่างตรงที่ queue มีตัวชี้ 2 ตัวคือ หัว(Head) และหาง(Tail) โดยการใส่ข้อมูลเข้าและนำข้อมูลออก จะมีลักษณะ.
stack #1 ผู้สอน อาจารย์ ยืนยง กันทะเนตร
Linked List Lecturer : Kritawan Siriboon, Room no. 913
Queue [2] ผู้สอน อาจารย์ ยืนยง กันทะเนตร
Method and Encapsulation
Linked List (ต่อ) Lecturer : Kritawan Siriboon, Room no. 913
โครงสร้างข้อมูลและขั้นตอนวิธี (Data Structures and Algorithms)
โครงสร้างข้อมูลแบบสแตก (stack)
Dr.Surasak Mungsing CSE 221/ICT221 การวิเคราะห์และออกแบบขั้นตอนวิธี Lecture 05: การวิเคราะห์ความซับซ้อนของ ขั้นตอนวิธีการเรียงลำดับข้อมูล.
Data Structures and Algorithms 2/2561
Data Structures & Algorithms Using Python
Data Structures and Algorithms 2/2561
Data Structures & Algorithms Using Python
2 โครงสร้างข้อมูลแบบสแตก (STACK).
3 โครงสร้างข้อมูลแบบคิว (QUEUE).
Array: One Dimension Programming I 9.
ใบสำเนางานนำเสนอ:

Stack (Push Down Stack)

Data Structures & Algorithms In this course, Data Structures & Algorithms : Data Structures  abstract data types : stack, queue, linked list, trees, heap, graph. Algorithms : recursion, complexity (algorithm analysis) , hashing, searching, sorting.

Stack Stacks กองของ http://clipart-library.com/search/

push pop Top of the stack Stack LIFO Last in First out ของในกองมีลำดับ ordered collection of items มีปลายด้านบนเรียก top ของ stack เอาของเข้า (push) ออก (pop) ที่ top ของ stack push pop Top of the stack LIFO Last in First out อันสุดท้าย ถูกเอาออกก่อน เอาออก pop อันไหน ? อันบนสุด top ใส่ push ที่ไหน? top http://www.clipartpanda.com

Queue Queue แถวคอย ? http://www.gograph.com/vector-clip-art/queue.html

front head rear tail FIFO List FirstInFirstOut enQueue (insert) ของในแถวมีลำดับ ordered collection of items มีปลายด้านหนึ่งเรียก rear/tail สำหรับใส่ของเข้า (enQueue) และอีกด้านหนึ่งเรียก front/head สำหรับเอาของออก (deQueue) FIFO List FirstInFirstOut front head rear tail deQueue (delete) enQueue (insert) I need some ! Where should I go ? Next ! Oh my turn  Who ?

Superset of Stack & Queue list List : ordered collection of items ของใน list มีลำดับ ใส่ของเข้า (insert) เอาของออก (delete) ที่ไดก็ได้ Superset of Stack & Queue To Buy : Bread Milk Eggs Fruit Rice Pasta Butter Juice insert / delete head tail

Stack Applications Parenthesis Matching Evaluate Postfix Expression Infix to Postfix Conversion (Reverse Polish Notation) Function Call (clearly see in recursion)

( a+b-c *[d+e]/{f*(g+h) } Parenthesis Matching ( a+b-c *[d+e]/{f*(g+h) } ( a+b-c }*[d+e]/{f*(g+h) } ( a+b-c )*[d+e] } ( 3 + 2 ) / { 4**5 } Match ? Algorithm ?

[ (a+b)*{ (d+e)-3}] random / / / / / / / / ↑ ↑ Parenthesis Matching Simulate เลียนแบบ Data Structure : Python List Expensive Use Stack [ (a+b)*{ (d+e)-3}] / / / / / / / / ↑ ↑ Repeat สุ่มตำแหน่ง (until จบ || not match) Scan ออกสองข้าง if Left == open paren & Right == close paren if match : Check out. goto 2 else จบ : Not match. else goto 1

[ (a+b)*{ (d+e)-3} ] } ] } [ [ ( ) { ( ) } ] } ) ( ) { ( [ [ Parenthesis Matching [ (a+b)*{ (d+e)-3} ] MissMatch Match } scan ซ้าย -> ขวา ] } เพื่อให้เห็นชัด Clear out ส่วนที่ไม่เกี่ยวข้อง [ [ ( ) { ( ) } ] } ) scan . . . ( ปิด คู่ เปิดที่พึ่งพบ คู่ กันจาก ในออกนอก ) { ( Parenthesis มีลักษณะเป็น stack [ [ stack

Data : ของมีลำดับ มีปลายบน Methods : init empty stack init() Stack Implementation Logical ADT : Data : ของมีลำดับ มีปลายบน Methods : init empty stack init() insert i ที่ top push(i) เอาของที่ top ออก i = pop() ดูของที่ top (ไม่เอาออก) i = peek() stack empty ? b = isEmpty() stack full ? b = isFull() หาจำนวนของใน stack i = size() Implementation ? Python List pop push S = [] Top S.append(i) ใส่ท้าย i = S.pop() อันท้าย LIFO Last in First out

Stack Data Implementation __init__() : constructor ให้ค่าตั้งต้น 2 underscores 2 underscores

Data Implementation : __init__() self คือ object ที่เรียก method ในแต่ละครั้ง เช่น s = Stack() self หมายถึง s เสมือนเรียก s = Stack(s) self จะถูก pass เป็น arg. ตัวแรก โดยอัตโนมัติ Data Implementation : __init__() Data Implementation : Stack กองของซ้อนกัน ของมีลำดับ มีปลายด้านบน -> Python List ทำใน constructor docstring : ใน triple quote print(Stack.__doc__)  docstring class Stack: """ class Stack create empty stack """ def __init__(self): self.items = [] self.size = 0 Class Data สำหรับทุก stack constructor ถูกเรียกโดยอัตโนมัติเมื่อ instantiate instance ใหม่ total = 0 # class data items , size: Instance Attributes /data สำหรับแต่ละ instance stack.total += 1 items [ ] size s = Stack() print(s.items) print(s.size) เรียกชื่อ class : สร้าง object ใหม่ (instantiate instance/obj) ไปเรียก constructor ฟังก์ชั่น __init__() [] s2 = Stack() print(s.total)  2

Mutable Type Default Argument ให้ = ค่านี้ เมื่อไม่มีการ pass ค่ามา ค่า default จะถูกสร้างขึ้นครั้งเดียว ณ function definition ใน scope ที่ define functon ต้องระวัง เมื่อเป็น mutable type def f( L = [] ): print(L) L.append(1) f() f([2]) def f(L = None): if L is None: L = [] else : pass L.append(1) ถ้า f() เป็น constructor ของ stack จึง init empty stack เพียงครั้งแรกเท่านั้น ทางแก้  output [] [1] [2] [1, 1] f() L default L [ ] 1 , 1 , 1 default L None L L [2 ] , 1 [ ] 1

__init__() with Default Argument class Stack: """ class Stack default : empty stack / Stack([list]) """ def __init__(self, list = None): if list == None: self.items = [] else: self.items = list default argument ถ้าไม่มีการ pass arg. มา list = None ถ้า pass arg. มา list = ตัวที่ pass มา s = Stack() s1 = Stack(['A', 'B', 'C']) ไม่เหมือนกับ C++ & Java ใน Python มี constructor ได้ตัวเดียว

Stack Operation Implementation 1. Data : __init__() : constructor ให้ค่าตั้งต้น 2. Methods (Operations) : 2. push() : ใส่ ด้านบน top 3. pop () : เอาออก ด้านบน top 4. peek() : ดู top ไม่เอาออก 5. isEmpty() : stack ว่าง ? 6. size() : มีของกี่อัน

push() C B A class Stack: Check Stack Overflow ? def push(self, i): class Stack: def __init__(self, list = None): if list == None: self.items = [] else: self.items = list self.size = len(self.items) Check Stack Overflow ? -> No Python list automatically expanding size self.items.append(i) self.size += 1 list.append (i): insert i ที่ท้าย list s.items s = Stack() s.push('A') s.push('B') s.push('C') [] A B C ['A'] ['A', 'B'] ['A', 'B', 'C' ]

pop() อย่าลืม return !!! B A class Stack: def __init__(self, list = None): if list == None: self.items = [] else: self.items = list def pop(self): # remove & return อันบนสุด return self.items.pop() อย่าลืม return !!! list.pop() : delete ตัวสุดท้ายของ list list.pop(i) : delete ตัวที่ index i ของ list print(s.items) print(s.pop()) s.pop() ['A', 'B'] B A B # error Stack Underflow A

peek() B A class Stack: def __init__(self, list = None): if list == None: self.items = [] else: self.items = list def peek(self): # return อันบนสุด return self.items[ -1] -1 : last index print(s.items) print(s.peek()) ['A', 'B'] B B A ['A', 'B']

isEmpty() B A class Stack: def __init__(self, list = None): if list == None: self.items = [] else: self.items = list def isEmpty(self): return self.items == [] return len(self.items) == 0 print(s.items) print(s.isEmpty()) B ['A', 'B'] A false

size() B A class Stack: def __init__(self, list = None): if list == None: self.items = [] else: self.items = list def size(self): return len(self.items) print(s.items) print(s.size()) ['A', 'B'] B A 2

Stack Implementation __str__() ต้อง return string class Stack: default : empty stack / Stack([...]) """ def __init__(self, list = None): if list == None: self.items = [] else: self.items = list def __str__(self): s = 'stack of '+ str(self.size())+' items : ' for ele in self.items: s += str(ele)+' ' return s def push(self, i): self.items.append(i) def pop(self): return self.items.pop() def peek(self): return self.items[-1] def isEmpty(self): return self.items == [] def size(self): return len(self.items) __str__() ต้อง return string s1 = Stack([1,2,3]) print(s1.items) [1, 2, 3] print(s1) stack of 3 items : 1 2 3

Writing Code Def parenMatch(s) : # code? คิด?

Design Tools, Warnier-Orr Diagram if openParen(c) : s.push(c) elif closeParen(c) : ch = s.pop() match = isMatch(c, ch) Code : difficult if (c is an open parenthesis) push c to stack s else if (c is an close parenthesis) pop ch from stack s if (ch matches c) match = true else match = false Pseudocode : easier Warnier – Orr Diagram : easier c == open paren s.push(c) c == close paren pop&check + or Warnier – Orr Diagram + ch = s.pop() match = isMatch(ch, c) if … then not A A

Warnier-Orr Diagram Design Tool Init empty stack s [ (a+b)*{ (d+e)-3}] read ch error=false ch = non_paren Scan (not EOF && not error) ch = open paren ch = close paren + s.push(ch) s.empty() + error =true(no-open-paren) open = s.pop() Paren matching match(open,ch) match(open,ch) error = true (missmatch) error + no open-paren / missmatch s.empty() + MATCH ( MISSMATCH open paren exceed [

Python : Parenthesis Matching def parenMatching(str): s = Stack() i = 0 # index : str[i] error = 0 while i < len(str) and error == 0 : c = str[i] if c in '{[(': s.push(c) else: if c in '}])': if s.size() > 0: if not match(s.pop(),c): error = 1 # open & close not match else: # empty stack error = 2 # no open paren i += 1 if s.size() > 0: # stack not empty error = 3 # open paren(s) excesses return error,c,i,s str = '[{a+b-c}' err,c,i,s = parenMatching(str) if err == 1: print(str , 'unmatch open-close ') elif err == 2: print(str , 'close paren excess') elif err == 3: print(str , 'open paren(s) excess ', s.size(),': ',end='' ) for ele in s.item: print(ele,sep=' ',end = '') print() else: print(str, 'MATCH') def match(open, close): return (open == '(' and close == ')') or \ (open == '{' and close == '}') or \ (open == '[' and close == ']') def match2(op,cl): opens = "([{" closes = ")]}" return opens.index(op) == closes.index(cl)

Stack Application Parenthesis Matching Evaluate Postfix Expression Infix to Postfix Conversion (Reverse Polish Notation) Function Call (clearly see in recursion)

Postfix Notation (Polish Notation) Infix Form Prefix Form Postfix Form a + b + a b a b + a + b * c + a * b c a b c * +

Evaluate Postfix Notation Postfix Notation มีธรรมชาติเป็น stack: operator เป็นของ operands 2 ตัวก่อนหน้ามัน 6 5 2 3 + 8 * - 3 + * = ? 3 5 6 S input: 6523 input: + Push : 6, 5, 2, 3 o2 <- pop#1 o1 <- pop#2 push S 2 5 + 6 5 What ‘s next ?

6 5 2 3 + 8 * - 3 + * = ? input: 6523 Push : 6 5 2 3 3 2 5 6 s input: + pop#1 → 3 pop#2 → 2 5 push 2+3 6 s input: 8 8 push 8 5 6 input: * pop#1 → 8 40 pop#2 → 5 5 push 5*8 6 input: - pop#1 → 40 pop#2 → 5 -35 push 5-40 6 input: 3 push 3 3 -35 6 input: + pop#1 → 3 pop#2 → -35 -32 push -35+3 6 input: * pop#1 → -32 pop#2 → 6 push 6 * -32 - 192

Stack Application Parenthesis Matching Evaluate Postfix Expression Infix to Postfix Conversion (Reverse Polish Notation) Function Call (clearly see in recursion)

Infix to Postfix Conversion a * b + c ab*c+ a*b+c ===> Notice : output: operands’ order is the same as input’s. output stack

Infix to Postfix Conversion a*b+c ---- > input: stack: output: a*b+c a a*b+c * a a*b+c * ab a*b+c + ab* a*b+c + ab*c a*b+c ab*c+

Infix to Postfix Conversion a+b*c ---- > input: stack: output: a+b*c a a+b*c + a a+b*c + ab * a+b*c + abc a+b*c abc*+

Infix to Postfix Conversion a+b*c-d => abc*+d- input: stack: output: a+b*c-d a a+b*c-d + a a+b*c-d + ab * a+b*c-d + abc a+b*c-d - abc*+ a+b*c-d - abc*+d a+b*c-d abc*+d-

Infix to Postfix Conversion a+b*c-(d/e+f)*g => abc*+de/f+g*- a+b*c-(d/e+f)*g + ab * a+b*c-(d/e+f)*g + abc a+b*c-(d/e+f)*g - abc*+ ( a+b*c-(d/e+f)*g - abc*+d / a+b*c-(d/e+f)*g - abc*+de

Infix to Postfix Conversion (cont.) a+b*c-(d/e+f)*g => abc*+de/f+g*- / ( a+b*c-(d/e+f)*g - abc*+de + a+b*c-(d/e+f)*g - abc*+de/f a+b*c-(d/e+f)*g - abc*+de/f+ * a+b*c-(d/e+f)*g - abc*+de/f+g a+b*c-(d/e+f)*g - abc*+de/f+g*-

Stack Application Parenthesis Matching Evaluate Postfix Expression Infix to Postfix Conversion (Reverse Polish Notation) Function Call (clearly see in recursion)