Стек Python и классы очередь, реализуется с помощью списков


Я сделал стек и реализации очереди с ООП в Python (простите за имена переменных) . Это сделано с нуля. Я просто смотрел видео, как эти две вещи работают. Я все еще пытаюсь улучшить в ООП, так что я буду благодарен за каждый совет. Две вещи, которые беспокоят меня больше всего используете que и sta в начале и будет ли это нормально, чтобы просто использовать уже реализованные функции в Python, например .pop() .

Очереди

que = []

class Queue:
    def __init__(self,queue):
        self.queue = queue

    def push(self,item):
        print ("PUSH",item)

        if len(self.queue)!=0:
            self.queue.append(0)
            for i in range(len(self.queue)-1,0,-1): ## replacing elements 
                self.queue[i] = self.queue[i-1]
            self.queue[0] = item

        else:
            self.queue.append(item)

    def pop(self):
        print ("POP",self.queue[-1])

        if len(self.queue)!=0:
            self.queue.pop()
        else:
            raise ValueError('Cant pop from empty queue.')

    def __str__(self):
        return (str(self.queue))

## creating QUEUE  
que = Queue(que)
que.push(5)
print (que)
que.push(6)
print (que)
que.push(7)
print (que)
que.pop()
print (que)

Стек

class Stack:
    def __init__(self,stack):
        self.stack = stack

    def push(self,item):
        print ("PUSH",item)

        if len(self.stack)!=0:
            self.stack.append(0)
            for i in range(len(self.stack)-1,0,-1):
                self.stack[i] = self.stack[i-1]
            self.stack[0] = item

        else:
            self.stack.append(item)

    def pop(self):
        print ("POP",self.stack[0])

        if len(self.stack)!=0:
            self.stack.pop(0)
        else:
            raise ValueError('Cant pop from empty stack.')

    def __str__(self):
        return (str(self.stack))
## creating STACK
stac = Stack(sta)
stac.push(5)
print(stac)
stac.push(7)
print(stac)
stac.push(2)
print(stac)
stac.pop()
print(stac)


Комментарии
2 ответа

Есть несколько вещей, чтобы упомянуть.

Во-первых, это может быть хорошей идеей, чтобы инициализировать оба Queue и Stack с пустыми списками по умолчанию:

def __init__(self, queue=None):
self.queue = queue or [] # if queue is given, it overrides the default

Далее нет смысла писать что-то вроде if len(self.queue)!=0 поскольку это равносильно if self.queue (пустой список False когда он отлит в bool). Вы можете пойти еще дальше и ввести property называется size используя встроенный декоратор:

@property
def size(self):
return len(self.queue)

Теперь она может быть доступна self.size без вызова функции.

4
ответ дан 13 февраля 2018 в 09:02 Источник Поделиться

Принятие существующего списка-это вообще плохая идея. Код снаружи Queue и Stack классы могут по-прежнему содержать ссылку на список и манипулировать ею за спину. Самое простое средство-это всегда построить объект как пустой структуры данных.

В Stackдобавление и удаление элементов в начало списка (с индексом 0) дает худшие показатели, поскольку каждый существующий элемент должен быть смещен более чем. Эта работа отчетливо видна в .push()но менее очевидно, self.stack.pop(0) также делает такую работу. Для эффективности, необходимо добавить и обрезать элементы в конец списка, а не.

3
ответ дан 13 февраля 2018 в 09:02 Источник Поделиться