1. 程式人生 > >python ——兩個佇列實現一個棧&兩個棧實現一個佇列

python ——兩個佇列實現一個棧&兩個棧實現一個佇列

1、兩個佇列實現一個棧

進棧:元素入佇列A

出棧:判斷如果佇列A只有一個元素,則直接出隊。否則,把隊A中的元素出隊併入隊B,直到隊A中只有一個元素,再直接出隊。為了下一次繼續操作,互換隊A和隊B。

python實現如下:

class StackWithTwoQueues(object):
    #定義兩個空佇列
    def __init__(self):
        self.queue1 = []
        self.queue2 = []
    #入棧
    def push(self, item):
        self.queue1.append(item)
    #出棧
    def pop(self):
        if len(self.queue1) == 0:
            return(None)
        while(len(self.queue1) != 1):
            self.queue2.append(self.queue1.pop(0))
        self.queue1, self.queue2 = self.queue2, self.queue1
        return (self.queue2.pop())
#test
if __name__ == '__main__':
    ss = StackWithTwoQueues()
    list = [0, 1, 2, 3, 4]
    for i in range(5):
        ss.push(list[i])
    print(list)
    for i in range(5):
        print(ss.pop(), ',', end = '')
#output
#[0, 1, 2, 3, 4]
#4, 3, 2, 1, 0

2、兩個棧實現一個佇列

入隊:元素進棧A

出隊:先判斷棧B是否為空,為空則將棧A中的元素 pop 出來並 push 進棧B,再棧B出棧,如不為空則棧B直接出棧。

python實現如下:

class QueueWithTwoStacks(object):
    #定義兩個空棧
    def __init__(self):
        self.stack1 = []
        self.stack2 = []
    #入隊
    def enqueue(self, item):
        self.stack1.append(item)
    #出隊
    def dequeue(self):
        if self.stack2:
            return(self.stack2.pop())
        else:
            if self.stack1 != []:
                while(self.stack1):
                    self.stack2.append(self.stack1.pop())
                return(self.stack2.pop())
            else:
                return(None)
# test
if __name__ == '__main__':
    qq = QueueWithTwoStacks()
    list = [0, 1, 2, 3, 4]
    for i in range(5):
        qq.enqueue(list[i])
    print(list)
    for i in range(5):
        print(qq.dequeue(), ',', end='')
#output
#[0, 1, 2, 3, 4]
#0, 1, 2, 3, 4,