Python'da Stack

b0mb

Katılımcı Üye
14 Mar 2017
471
1
İzmir
Merhabalar,

Stack'in ne olduğunu merak ediyorsanız, ALcatraz' hocamın açtığı konuyu inceleyebilirsiniz.

Kod:
#!/usr/bin/env python2
#-*- coding: utf-8 -*-
#
#

"https://gist.github.com/laszlokuehl/ce69f6abc3e4e2f1e94f2adf2196bee0"

__author__ = '@laszlokuehl'

class Stack:
    def __init__(self, maxSize):
        self.maxSize = int(maxSize)
        self.__data = []

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

    def __repr__(self):
        return self.__str__()

    def __error(self, msg):
        raise Exception(msg)

    def isEmpty(self):
        return len(self.__data) == 0

    def isFull(self):
        return len(self.__data) == self.maxSize

    def push(self, item):
        return self.__data.append(item) if self.isFull() != True else self.__error('Stack is full')

    def pop(self):
        return self.__data.pop(-1) if self.isEmpty() != True else self.__error('Stack is empty')

    def peek(self):
        return self.__data[-1] if self.isEmpty() != True else self.__error('Stack is empty')

    def search(self, item):
        return self.__data.index(item) if self.isEmpty() != True else self.__error('Stack is empty')

Aşağıda kullanımı bulunuyor.

Kod:
>>> 
>>> stack = Stack(20)
>>> 
>>> stack.isEmpty()
True
>>> 
>>> [stack.push(x) for x in range(20)]
[None] * 20
>>> 
>>> stack.isEmpty()
False
>>> 
>>> stack.isFull()
True
>>> 
>>> stack.peek()
19
>>> 
>>> stack.search(8)
8
>>> 
>>> [stack.pop() for x in range(20)]
[19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
>>> 
>>> stack.push('test')
>>> stack.push('test2')
>>> stack.push('test3')
>>> 
>>> stack.search('test')
0
>>> 
>>> stack.search('test3')
2
>>>
 

Ceys

Yaşayan Forum Efsanesi
2 Nis 2016
7,658
4,963
Orhun Nehri
Eline sağlık ;)
Mantığınıda resimle anlatsaydın iyi olurdu ama zaten konu eklemişsin aynı mantık :)
 

King Kong

Kıdemli Üye
19 Mar 2017
2,392
10
Ah Vikingim Yaşıyomusun Sen ?

Ateşli Sohbetler İçin PM At Ellerine Sağlık Bu Arada :trl
 

Zeref

Uzman üye
13 Nis 2014
1,960
3
fy
Bu sınıf performanslı olur mu ki zaten liste kullanarak tanımlanır tek yaptığı listeye stackoverflow özetlerini atamak.
 

b0mb

Katılımcı Üye
14 Mar 2017
471
1
İzmir
Bu sınıf performanslı olur mu ki zaten liste kullanarak tanımlanır tek yaptığı listeye stackoverflow özetlerini atamak.

Normal listeye ekleme yapmaktan farkı, fazladan bir if bulundurmak :D
Ayrıca, bir liste objesinde bulunan "__getitem__" fonksiyonunu bulundurmuyor, bu yüzden direk erişim yok, anca "obj._Stack__data[index]" diye erişebiliyoruz.

Bu arada, yukarıdaki örneği şöyle de anlatabiliriz,

Kod:
>>> _geri = Stack(20)
>>> _ileri = Stack(20)
>>> 
>>> def geri():
...     _ileri.push(_geri.pop())
...     
>>> 
>>> def ileri():
...     _geri.push(_ileri.pop())
...     
>>> 
>>> _geri.push('google.com')
>>> _geri.push('github.com')
>>> _geri.push('github.com/laszlokuehl')
>>> 
>>> geri()
>>> 
>>> _ileri
['github.com/laszlokuehl']
>>> 
>>> geri()
>>> 
>>> geri()
>>> 
>>> _ileri
['github.com/laszlokuehl', 'github.com', 'google.com']
>>> 
>>> ileri()
>>> ileri()
>>> ileri()
>>> 
>>> _geri
['google.com', 'github.com', 'github.com/laszlokuehl']
>>> 
>>> _ileri
[]
>>>
 
Moderatör tarafında düzenlendi:
Üst

Turkhackteam.org internet sitesi 5651 sayılı kanun’un 2. maddesinin 1. fıkrasının m) bendi ile aynı kanunun 5. maddesi kapsamında "Yer Sağlayıcı" konumundadır. İçerikler ön onay olmaksızın tamamen kullanıcılar tarafından oluşturulmaktadır. Turkhackteam.org; Yer sağlayıcı olarak, kullanıcılar tarafından oluşturulan içeriği ya da hukuka aykırı paylaşımı kontrol etmekle ya da araştırmakla yükümlü değildir. Türkhackteam saldırı timleri Türk sitelerine hiçbir zararlı faaliyette bulunmaz. Türkhackteam üyelerinin yaptığı bireysel hack faaliyetlerinden Türkhackteam sorumlu değildir. Sitelerinize Türkhackteam ismi kullanılarak hack faaliyetinde bulunulursa, site-sunucu erişim loglarından bu faaliyeti gerçekleştiren ip adresini tespit edip diğer kanıtlarla birlikte savcılığa suç duyurusunda bulununuz.