数据结构-六 栈和队列

只允许在一端进行插入或删除的线性表

栈顶:栈中只允许插入和删除的一端

栈底:固定的,不允许进行插入和删除的一端

线性表是后进后出型,LIFO。

顺序栈

栈是线性表的特列,栈的顺序也是线性表顺序存储的简化,栈的顺序存储结构也叫做顺序栈

空栈:top==-1,满栈 top == MaxSize -1,栈中元素个数 top+1 个

class Stack(object):
    def __init__(self):
        self.stack = []
    
    # 进栈
    def push(self, value):    
        self.stack.append(value)

    #出栈
    def pop(self):  
        if self.stack:
            self.stack.pop()
        else:
            raise LookupError('stack is empty!')

    # 判空
    def is_empty(self): 
        return bool(self.stack)
    
    # 读取栈顶元素
    def top(self): 
        #取出目前stack中最新的元素
        return self.stack[-1]

共享栈

 顺序栈的存储空间大小需要事先开辟好,很多时候对每个栈各自单独开辟存储空间的利用率不如各个栈的存储空间共享

扫描二维码关注公众号,回复: 9315007 查看本文章

栈满:top1 + 1 = top2

链式栈

栈是线性表的特例,线性表的存储结构还有链式存储结构,所以可以用链表的方式来实现栈。栈的链式存储也叫做链栈。

栈满:不存在

空栈:top = Null

""" 栈的链式存储"""


# 创建结点类
class Node(object):
    def __init__(self,value,next = None):
        self.value = value
        self.next = next


class Lstack:
    def __init__(self):
        # 标记栈顶位置
        self._top = None

    def is_empty(self):
        return self._top is None  # 判断是否为空

    # 入栈
    def push(self,elem):
        # node = Node(elem)
        # node.next = self._top
        # self._top = node
        self._top = Node(elem,self._top)

    # 出栈
    def pop(self):
        if self._top is None:
            raise StackError("stack is empty")
        p = self._top
        self._top = p.next
        return p.value

    # 查看栈顶元素
    def top(self):
        if self._top is None:
            raise StackError("stack is empty")
        return self._top.value

    # 栈清空
    def clear(self):
        self._top = None

队列

队列只允许在一端进行插入,而在另一端进行删除的线性表。

队头:允许删除的一端,又称为队首

队尾:允许插入的一端

先进入的元素必然先离开队列,即先进先出FIFO。

顺序队列

用数组来实现队列,可以将队首放在数组下标为0的位置。

循环队列

入队:rear = (rear+1)%MaxSize

出队:front= (front + 1) % MaxSize

链式队列

链式队列还是单链表,只是只能表尾插入元素,表头删除元素。

双端队列

双端队列是指允许两端都可以进行入队和出队操作的队列。

发布了56 篇原创文章 · 获赞 8 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/Dawn510/article/details/97936261