Python数据结构:堆栈与队列

堆栈

在堆栈这种数据结构中,数据的存取会服“先进后出”原则。
生活中最常见的例子就是打开抽屉,假如有一排抽屉我们需要一一打开检查,我们会从下往上打开抽屉,再从上往下关闭——“先进后出”,先打开的抽屉最后再关闭。
再比如和人下棋,发现自己下错了,需要悔棋,执行的也是堆栈操作。
堆栈有两种常见的实现方式:列表和链表。

用列表实现堆栈

top指定堆栈最上层元素。
每当压入数据时,top+=1
每当弹出数据时,top-=1

top=-1
STACK=[None]*10
def push(STACK,top,value)
    if top==9:
        print('堆栈已满')
    else:
        top+=1
        SATCK[top]=value
    return SATCK,top
def pop(STACK,top):
    if top==-1:
        print('堆栈已空')
    else:
    p=SATCK[top]
    top-=1
    return SATCK,top,p

用链表实现堆栈

top指向堆栈顶端,压入数据时新数据指向top,top指向新数据。
弹出数据时,top=top.next

class Node:
    def __init__(self):
        self.value=0
        self.next=None
head=Node()
top=head
def push(top,value):
    newnode=Node()
    newnode.value=value
    newnode.next=top
    top=newnode
    return top
def pop(top):
    p=None
    if top==None:
        print('堆栈已空')
    else:
        p=top.value
        top=top.next
    return top,p

更多详细说明和代码请点击这里

队列

队列和堆栈不同,它具有先进先出的特点。
就好像我们排队买东西一样,先排队的人先付钱。
队列同样有两种实现方式:列表和链表。

用列表实现队列

需要用front和rear分别指定队列的头和尾。
压入数据时,rear+1
弹出数据时,front+1

front=-1
rear=-1
queue=[None]*10
def push(queue,rear,value):
    if rear==9:
        print('队列已满')
    else:
        rear+=1
        queue[rear]=value
    return queue,rear
def pop(queue,front,rear):
    p=None
    if front==rear:
        print('队列已空')
    else:
        p=queue[front]
        front+=1
    return queue,front,p

用链表实现队列

加入数据时,先判断front是否存在,若不存在,则需要新建一条队列,若存在,则将rear.next指向新数据,再将rear指向新数据。
弹出数据时,先判断front是否存在,若存在,则将front指向front.next

class Node:
    def __init__(self):
        self.value = 0
        self.next=None
rear=None
front=None
def push(value,front,rear):
    newnode=Node()
    newnode.value=value
    if front==None:
        print('这是一个空队列')
        rear=newnode
        front=newnode
    else:
        rear.next=newnode
        rear=newnode
    return front,rear
def pop(front):
    if front=None:
        print('这是一个空队列')
    else:
        p=front.value
        front=front.next
    return p,front

更多详细说明和代码请点击这里

你可能感兴趣的:(数据结构)