Python数据结构——栈、队列的实现(二)

1. 一个列表实现两个栈

class Twostacks(object):

    def __init__(self):

        self.stack=[]

        self.a_size=0

        self.b_size=0

        self.top=0

    def a_isEmpty(self):

        return self.a_size==0

    def a_push(self,item):

        self.stack.insert(self.a_size,item)

        self.a_size+=1        

    def a_pop(self):

        if self.a_size>=1:

            item=self.stack[self.a_size-1]

            self.stack.remove(item)

            self.a_size-=1

            return item

    def b_isEmpty(self):

        return self.b_size==0

    def b_push(self,item):

        self.stack.insert(self.a_size,item)

        self.b_size+=1

    def b_pop(self):

        if self.b_size>=1:

            item=self.stack[self.a_size]

            self.stack.remove(item)

            self.b_size-=1

            return item

2. 两个栈实现一个队列

有两个栈s1,s2。入队时,将元素压入s1。出队时,判断s2是否为空,如不为空,则直接弹出顶元素;如为空,则将s1的元素逐个“倒入”s2,把最后一个元素弹出并出队。

class Stack(object):

    def __init__(self):

        self.stack=[]

    def isEmpty(self):

        return self.stack==[]

    def push(self,item):

        self.stack.append(item)

    def pop(self):

        if self.isEmpty():

            raise IndexError,'pop from empty stack'

        return self.stack.pop()

    def size(self):

        return len(self.stack)

class Queue_with_stacks(object):

    def __init__(self):

        self.stackA=Stack()

        self.stackB=Stack()

    def isEmpty(self):

        return self.stackA.isEmpty() and self.stackB.isEmpty()

    def enqueue(self,item):

        self.stackA.push(item)

    def dequeue(self):

        if self.stackB.isEmpty():

            if self.stackA.isEmpty():

                raise IndexError,'queue is empty.'

            while self.stackA.size()>=2:

                self.stackB.push(self.stackA.pop())

            

            return self.stackA.pop()

        else:

            return self.stackB.pop()

3. 两个队列实现一个栈

class Queue(object):

    def __init__(self):

        self.queue=[]

    def isEmpty(self):

        return self.queue==[]

    def enqueue(self,x):

        self.queue.append(x)

    def dequeue(self):

        if self.queue:

            a=self.queue[0]

            self.queue.remove(a)

            return a

        else:

            raise IndexError,'queue is empty'

    def size(self):

        return len(self.queue)

class Stack_with_queues(object):

    def __init__(self):

        self.queueA=Queue()

        self.queueB=Queue()

    def isEmpty(self):

        return self.queueA.isEmpty() and self.queueB.isEmpty()

    def push(self,item):

        if self.queueB.isEmpty():

            self.queueA.enqueue(item)

        else:

            self.queueB.enqueue(item)

    def pop(self):

        if self.isEmpty():

            raise IndexError,'stack is empty'

        elif self.queueB.isEmpty():

            while not self.queueA.isEmpty():

                cur=self.queueA.dequeue()

                if self.queueA.isEmpty():

                    return cur

                self.queueB.enqueue(cur)

        else:           

             while not self.queueB.isEmpty():

                cur=self.queueB.dequeue()

                if self.queueB.isEmpty():

                    return cur

                self.queueA.enqueue(cur)

  

你可能感兴趣的:(python)