DSA Material

Stack va Queue

Share to

Stack va queue cheklangan kirishli ma'lumotlar tuzilmalaridir.

Kitobga moslik (8 va 9-boblar)

Necaise ketma-ketligi quyidagilarni keltiradi:

Kitobdan foydali farqlash:

To'g'ri Python konteynerini tanlash

Stack amallari

push(value)

Tepaga qo'shadi. Python ro'yxati bilan bu oxiriga append qilishdir.

Stack push amali

def push(self, value):
    self.items.append(value)

pop()

Tepadagi elementni olib tashlaydi va qaytaradi. Bu push'ning teskarisidir.

Stack pop amali

def pop(self):
    if not self.items:
        raise IndexError('pop from empty stack')
    return self.items.pop()

peek()

Tepadagi qiymatni olib tashlamasdan o'qiydi.

def peek(self):
    if not self.items:
        raise IndexError('peek from empty stack')
    return self.items[-1]

Queue amallari

enqueue(value)

Orqaga qo'shadi. Bog'langan ro'yxat asosidagi queue buni doimiy vaqtda bajaradi.

Queue enqueue amali

def enqueue(self, value):
    node = Node(value)
    if self.rear is None:
        self.front = self.rear = node
    else:
        self.rear.next = node
        self.rear = node
    self.size += 1

dequeue()

Old qismdan olib tashlaydi va qaytaradi. Agar queue bo'shab qolsa, front va rear'ni qayta tiklang.

Queue dequeue amali

def dequeue(self):
    if self.front is None:
        raise IndexError('dequeue from empty queue')

    value = self.front.value
    self.front = self.front.next
    if self.front is None:
        self.rear = None
    self.size -= 1
    return value

peek()

Old qismdagi qiymatni olib tashlamasdan o'qiydi.

def peek(self):
    if self.front is None:
        raise IndexError('peek from empty queue')
    return self.front.value

To'liq amalga oshirish

class Stack:
    def __init__(self):
        self.items = []

    def push(self, value):
        self.items.append(value)

    def pop(self):
        if not self.items:
            raise IndexError('pop from empty stack')
        return self.items.pop()

    def peek(self):
        if not self.items:
            raise IndexError('peek from empty stack')
        return self.items[-1]

    def is_empty(self):
        return len(self.items) == 0


class Node:
    def __init__(self, value, next_node=None):
        self.value = value
        self.next = next_node


class Queue:
    def __init__(self):
        self.front = None
        self.rear = None
        self.size = 0

    def enqueue(self, value):
        node = Node(value)
        if self.rear is None:
            self.front = self.rear = node
        else:
            self.rear.next = node
            self.rear = node
        self.size += 1

    def dequeue(self):
        if self.front is None:
            raise IndexError('dequeue from empty queue')

        value = self.front.value
        self.front = self.front.next
        if self.front is None:
            self.rear = None
        self.size -= 1
        return value

    def peek(self):
        if self.front is None:
            raise IndexError('peek from empty queue')
        return self.front.value

    def is_empty(self):
        return self.front is None

Real loyihalarda deque asosidagi queue

from collections import deque

q = deque()
q.append(10)      # enqueue
q.append(20)
print(q.popleft())  # dequeue -> 10

Amaliy kodda ham tezlik, ham soddalik kerak bo'lganda deque'dan foydalaning.

Murakkablik xulosasi

Amal Stack Queue
Qo'shish O(1) push O(1) enqueue
Olib tashlash O(1) pop O(1) dequeue
Peek O(1) O(1)

Tipik qo'llanilishlar

Andoza misoli: stack yordamida qavslarning to'g'riligini tekshirish

def is_valid_parentheses(text):
    pairs = {')': '(', ']': '[', '}': '{'}
    stack = []

    for ch in text:
        if ch in pairs.values():
            stack.append(ch)
        elif ch in pairs:
            if not stack or stack.pop() != pairs[ch]:
                return False

    return len(stack) == 0

Tipik xatolar