โครงสร้างข้อมูล Stack ใน Python คืออะไร?



บทความนี้จะให้ความรู้โดยละเอียดและครอบคลุมเกี่ยวกับ Stack Data Structures ใน Python พร้อมตัวอย่างมากมาย

โครงสร้างข้อมูลคือชุดของค่าข้อมูลความสัมพันธ์ระหว่างกันและฟังก์ชันหรือการดำเนินการที่สามารถนำไปใช้กับข้อมูลได้ ตอนนี้มีโครงสร้างข้อมูลมากมาย แต่วันนี้เรามุ่งเน้นไปที่ Stack Data Structures ฉันจะพูดคุยในหัวข้อต่อไปนี้:

ทำไมต้องมีโครงสร้างข้อมูล

เพื่อตอบคำถามนี้คุณจะต้องคิดในระดับใหญ่ ลองนึกดูว่า Google Maps แสดงเส้นทางที่ดีที่สุดให้คุณได้อย่างไรในเวลาเพียงเสี้ยววินาทีซึ่งจะส่งคืนผลการค้นหาในหน่วยไมโครวินาทีอย่างไร ไม่ได้จัดการกับเว็บไซต์เพียง 100 แห่งเท่านั้น แต่เกี่ยวข้องกับเว็บไซต์มากกว่าพันล้านแห่งและยังแสดงผลให้คุณเห็นได้อย่างรวดเร็ว





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

ประเภทของโครงสร้างข้อมูล

มีโครงสร้างข้อมูลมาตรฐานบางอย่างที่สามารถใช้เพื่อทำงานกับข้อมูลได้อย่างมีประสิทธิภาพ เรายังสามารถปรับแต่งหรือสร้างใหม่ทั้งหมดเพื่อให้เหมาะกับการใช้งานของเรา



ประเภทโครงสร้างข้อมูล

Stack Data Structure คืออะไร?

ลองพิจารณาตัวอย่างในชีวิตจริง:

  • การขนส่งสินค้า
  • แผ่นบนถาด
  • กองเหรียญ
  • กองลิ้นชัก
  • การแบ่งรถไฟในลานรถไฟ

plates-stacks-data-structure



ตัวอย่างทั้งหมดนี้เป็นไปตามก Last-In-First-Out กลยุทธ์. พิจารณาจานบนถาดเมื่อคุณต้องการเลือกจานคุณถูกบังคับให้เลือกจานจากด้านบนในขณะที่เมื่อเก็บจานไว้บนถาดพวกเขาจะต้องอยู่ในลำดับย้อนกลับ ตัวอย่างข้างต้นซึ่งเป็นไปตาม Last-In-First-Out (LIFO) หลักการเรียกว่า ซ้อนกัน .

นอกเหนือจากการดำเนินการเสริมแล้วฉันอาจพูดได้ว่าการดำเนินการหลักที่เป็นไปได้ในสแต็กคือ:

  1. ดันหรือแทรกองค์ประกอบไปที่ด้านบนสุดของสแต็ก
  2. ป๊อปหรือลบองค์ประกอบจากด้านบนของสแต็ก

การสร้างโครงสร้างข้อมูลกองซ้อน

class Stack: def __init __ (self, max_size): self .__ max_size = max_size self .__ elements = [None] * self .__ max_size self .__ top = -1
  • max_size คือจำนวนองค์ประกอบสูงสุดที่คาดหวังในสแต็ก
  • องค์ประกอบของสแตกจะถูกเก็บไว้ในรายการไพ ธ อน
  • ด้านบนแสดงดัชนีบนสุดของสแต็กซึ่งเริ่มต้น -1 เพื่อทำเครื่องหมายสแต็กว่าง

สถานะเริ่มต้นของ Stack สามารถดูได้ในรูปที่ max_size = 5

วิธีการตั้งค่าเส้นทาง java

พุชองค์ประกอบลงในกอง

ตอนนี้ถ้าคุณต้องการป้อนหรือพุชองค์ประกอบไปที่สแต็กคุณต้องจำไว้ว่า

  • ด้านบนจะชี้ดัชนีที่จะแทรกองค์ประกอบ
  • และจะไม่มีการแทรกองค์ประกอบเมื่อสแต็กเต็มเช่นเมื่อ max_size = top

แล้วอัลกอริทึมควรเป็นอย่างไร ??

# ส่งคืนขนาดสูงสุดของ stack def get_max_size (self): return self .__ max_size # ส่งคืนค่าบูลไม่ว่าสแต็กจะเต็มหรือไม่ True if full และ False หรือ def is_full (self): return self.get_max_size () - 1 == self .__ top #pushes องค์ประกอบที่ด้านบนของสแต็ก def push (self, data): if (self.is_full ()): print ('stack is already full') else: self .__ top = self .__ top + int (1 ) self .__ elements [self .__ top] = data # คุณสามารถใช้ด้านล่าง __str __ () เพื่อพิมพ์องค์ประกอบของออบเจ็กต์ DS ในขณะที่ดีบัก def __str __ (self): msg = [] index = self .__ top while (index> = 0): msg.append ((str) (self .__ elements [index])) index- = 1 msg = '' .join (msg) msg ​​= 'Stack data (Top to Bottom):' + msg return msg

ตอนนี้เมื่อคุณดำเนินการต่อไปนี้:

stack1 = สแต็ค (4)

# ผลักดันองค์ประกอบที่จำเป็นทั้งหมด

stack1.push (“ A”)

stack1.push (“ B”)

stack1.push (“ C”)

stack1.push (“ E”)

พิมพ์ (stack1.is_full ())

พิมพ์ (stack1)

เอาท์พุต:

กองเต็มแล้ว
จริง
ข้อมูลกองซ้อน (จากบนลงล่าง): D C B A

Pop Elements จาก Stack

ตอนนี้เมื่อคุณแทรกองค์ประกอบลงในสแต็กแล้วคุณต้องการที่จะแสดงองค์ประกอบเหล่านี้ดังนั้นคุณต้องดูแลสิ่งต่อไปนี้:

  • กองซ้อนไม่ว่างเปล่านั่นคือ top! = -1
  • เมื่อคุณลบข้อมูลด้านบนต้องชี้ไปที่ด้านบนสุดก่อนหน้าของสแต็ก

แล้วอัลกอริทึมจะเป็นอย่างไร ??

#returns ค่าบูลไม่ว่าสแต็กว่างหรือไม่ True ถ้าว่างและเป็นเท็จมิฉะนั้น def is_empty (self): return self .__ top == - 1 #returns popped value def pop (self): if (self.is_empty ()): print ('nothing to pop, already empty') else: a = self .__ elements [self .__ top] self .__ top = self .__ top-1 ส่งกลับ # แสดงองค์ประกอบสแต็กทั้งหมดจากบนลงล่างการแสดงผล def (ตัวเอง): สำหรับฉันอยู่ในช่วง (self .__ top, -1, -1): print (self .__ elements [i], end = '') print ()

ตอนนี้เมื่อพิจารณาถึงสแต็กที่สร้างขึ้นก่อนหน้านี้ให้ลองเปิดองค์ประกอบ

พิมพ์ (stack1.pop ())

พิมพ์ (stack1.pop ())

พิมพ์ (stack1)

พิมพ์ (stack1.pop ())

พิมพ์ (stack1.pop ())

พิมพ์ (stack1.pop ())

เอาท์พุต:

ข้อมูลสแต็ค (จากบนลงล่าง): B A

ถึง

ไม่มีอะไรจะปรากฏว่างเปล่าแล้ว

การประยุกต์ใช้โครงสร้างข้อมูลกองซ้อน

  • ตัวอย่างที่ 1:

สแต็กใช้เพื่อใช้อัลกอริธึมการจับคู่วงเล็บสำหรับการประเมินนิพจน์ทางคณิตศาสตร์และในการนำเมธอดไปใช้

คำตอบคือ 5

  • ตัวอย่างที่ 2:

คลิปบอร์ดใน Windows ใช้สองสแต็กเพื่อใช้การดำเนินการเลิกทำซ้ำ (ctrl + z, ctrl + y) คุณคงเคยทำงานกับโปรแกรมแก้ไขคำใน Windows เช่น MS-Word, Notepad เป็นต้นนี่คือข้อความที่เขียนด้วย MS-Word สังเกตว่าข้อความเปลี่ยนไปอย่างไรเมื่อคลิก Ctrl-Z และ Ctrl-Y

นี่คือรหัสที่จำลองการเลิกทำซ้ำ อ่านโค้ดและสังเกตวิธีใช้สแต็กในการนำไปใช้งานนี้

#creating class stack class Stack: def __init __ (self, max_size): self .__ max_size = max_size self .__ elements = [None] * self .__ max_size self .__ top = -1 def is_full (self): if (self .__ top == self .__ max_size-1): return True return False def is_empty (self): if (self .__ top == - 1): return True return False def push (self, data): if (self.is_full ()): print ('สแต็กเต็ม !!') else: self .__ top + = 1 self .__ elements [self .__ top] = data def pop (self): if (self.is_empty ()): print ('The stack is empty! ! ') else: data = self .__ elements [self .__ top] self .__ top- = 1 return data def display (self): if (self.is_empty ()): print (' The stack is empty ') else: index = self .__ top while (index> = 0): print (self .__ elements [index]) index- = 1 def get_max_size (self): return self .__ max_size # คุณสามารถใช้ __str __ () ด้านล่างเพื่อพิมพ์องค์ประกอบของ ออบเจ็กต์ DS ขณะดีบัก def __str __ (ตัวเอง): msg = [] index = self .__ top while (index> = 0): msg.append ((str) (self .__ elements [index])) index- = 1 msg = ' '.join (msg) msg ​​=' Stack data (จากบนลงล่าง): '+ msg ส่งคืน ms g #function เพื่อใช้ลบหรือลบการดำเนินการ backspace def remove (): คลิปบอร์ดส่วนกลาง, undo_stack data = clipboard [len (clipboard) -1] clipboard.remove (data) undo_stack.push (data) print ('Remove:', clipboard) #function เพื่อใช้การดำเนินการเลิกทำ def undo (): คลิปบอร์ดส่วนกลาง, undo_stack, redo_stack if (undo_stack.is_empty ()): พิมพ์ ('ไม่มีข้อมูลที่จะเลิกทำ') else: data = undo_stack.pop () clipboard.append ( data) redo_stack.push (data) print ('Undo:', clipboard) #function เพื่อใช้ทำซ้ำการดำเนินการ def redo (): คลิปบอร์ดส่วนกลาง, undo_stack, redo_stack if (redo_stack.is_empty ()): print ('ไม่มีข้อมูล to redo ') else: data = redo_stack.pop () if (data not in clipboard): print (' There is no data to redo ') redo_stack.push (data) else: clipboard.remove (data) undo_stack.push ( data) print ('Redo:', clipboard) clipboard = ['A', 'B', 'C', 'D', 'E', 'F'] undo_stack = Stack (len (clipboard)) redo_stack = Stack (len (คลิปบอร์ด)) ลบ () เลิกทำ () ทำซ้ำ ()

เอาท์พุต:

ลบ: ['A', 'B', 'C', 'D', 'E']

เลิกทำ: [‘A’, ‘B’, ‘C’, ‘D’, ‘E’, ‘F’]

ทำซ้ำ: [‘A’, ‘B’, ‘C’, ‘D’, ‘E’]

การเปลี่ยนแปลงการค้นหาในตัวอย่าง Informatica

ด้วยเหตุนี้เราจึงมาถึงตอนท้ายของบทความ Stack Data Structure ใน Python หากคุณเข้าใจและรันโค้ดด้วยตัวเองสำเร็จคุณจะไม่ใช่มือใหม่ในโครงสร้างข้อมูล Stacks อีกต่อไป

มีคำถามสำหรับเรา? โปรดระบุไว้ในส่วนความคิดเห็นของบทความนี้และเราจะติดต่อกลับโดยเร็วที่สุด

หากต้องการรับความรู้เชิงลึกเกี่ยวกับ Python พร้อมกับแอปพลิเคชันต่างๆคุณสามารถลงทะเบียนเพื่อถ่ายทอดสด ด้วยการสนับสนุนตลอด 24 ชั่วโมงทุกวันและการเข้าถึงตลอดชีวิต