2012年2月13日月曜日

pythonでスタック,キュー,連結リストを実装してみた

やってみた。linkedlistは強引に実装したため多分実用には堪えません。。

スタック
#! /usr/local/bin/python
# -*- coding:utf-8 -*-
class stack:
    def __init__(self,data=[]):
        self.data=data
    
    def stack_empty(self):
        if len(self.data)==0:
            return True
        else:
            return False
    def push(self,x):
        self.data.append(x)
    def pop(self):
        if self.stack_empty():
            print 'stack is empty'
        else:
            num=len(self.data)-1
            result=self.data[num]
            self.data=self.data[0:num]
            return result


キュー
#! /usr/local/bin/python
# -*- coding:utf-8 -*-
class queue():
    
    def __init__(self,data=[]):
        self.data=data
    def queue_empty(self):
        if len(self.data)==0:
            return True
        else:
            return False
    def enqueue(self,x):
        self.data.append(x)
    def dequeue(self):
        if self.queue_empty():
            print 'queue is empty'
        else:
            result=self.data[0]
            self.data=self.data[1:]
            return result


連結リスト

#! /usr/local/bin/python
# -*- coding:utf-8 -*-
class Linkedlist:
    class cell:
        def __init__(self,key,id,prev=None,next=None):
            self.id=id
            self.key=key
            self.prev=prev
            self.next=next
    def __init__(self,A=[]):
        self.count=1 # var for making cell_id unique
        self.obj=[]
        self.obj.append(self.cell(key='head',id=0,next=None))
        for i in range(len(A)):
            self.insert(A[i],self.count-1,None)
    def list_search(self,x):
        i=0
        while True:
            next=self.obj[i].next
            if next==None:
                break
            obj=self.obj[next]
            if obj.key==x:
                return obj
            i+=1
        return None
    def insert(self,key,prev,next):
        self.obj.append(self.cell(key,self.count,prev,next))
        self.obj[prev].next=self.count
        if next!=None:
            self.obj[next].prev=self.count
        self.count+=1
    def delete(self,key):
        if self.list_search(key)==None:
            print 'input_value doesn\'t exist in list'
        else:
            #search delete obj
            obj=self.list_search(key)
            self.obj[obj.prev].next=obj.next
            if obj.next!=None:
                self.obj[obj.next].prev=obj.prev
            self.obj[obj.id].prev=None
            self.obj[obj.id].next=None


連結リストはポインタじゃなくてオブジェクトのプロパティにidをもたせてそこをポインタっぽくすることで実装しました(こんなんでいいんでしょうかね^^;

0 件のコメント:

コメントを投稿