数据结构与算法----栈和队列(Stack & Queue)(一)

简介: 数据结构与算法----栈和队列(Stack & Queue)

写在前面:在学习栈和队列前我先强调一下,栈和队列都是一种编程思想,实现方式有很多种,我们只需要满足栈和队列各自的条件就可以,不必拘泥写一个类



栈是限定仅在表尾进行插入和删除的线性表,允许插入、删除的一端是栈顶,另一端成为栈低,不含任何数据元素的栈称为空栈。


假设S = [x1,x2,x3,x4,x5....xn],x1为栈底元素,xn为栈顶元素,插入和删除只能从xn端操作,进栈只能是按x1,x2,x3,x4,x5....xn的顺序进栈,出栈只能从栈顶出栈,也就是说,先进的数据元素后出去,后进的数据元素先出去。后进先出(LIFO last in fist out)


e90e203c62f4422e82c0e233d3ebe7a4.png


栈的操作


这里我们先创建一个栈的类,这里我们只是将基础的框架搭建了起来,并没有写具体的函数内容,后面再讲解的时候会具体说明。


# 第一个讲解我们使用的是顺序栈,具体的情况后面会有详细的介绍。
class SequenceStack:
    """顺序栈"""
    def __init__(self):
        """初始化"""
        self.stack_arr = []  # 栈空间,用列表
        self.top = 0         # 指针,指向栈顶
        self.maxsize = 10    # 设置栈的最大长度
    def push(self):
        """入栈"""
        pass
    def pop(self):
        """出栈"""
        pass
    def gethead(self):
        """得到栈顶的元素"""
        pass
    def isempty(self):
        """判断栈是否为空"""
        pass
    def size(self):
        """栈中的元素"""
        pass
    def next(self):
        """从栈顶遍历到栈底"""
        pass
    def clear(self):
        """清空栈"""
        pass


栈的初始化


栈的初始化就是创建一个空的栈,在本文章中栈的初始化就是创建sequencestack对象


stack = SequenceStack()


入栈


将新的元素添加到栈顶的位置,top指针向上移1


b69d6290d8604efaaf9fc1d44aaa4454.png


代码实现


    def push(self,arg):
        """入栈"""
        if self.top + 1 >= self.maxsize:
            print("栈已满,请重新选择操作")
            return 
        self.stack_arr.append(arg)
        self.top+=1


出栈


删除栈顶的数据元素



代码实现


    def pop(self):
        """出栈"""
        if self.top < 0:
            print("栈以空无法出栈")
            return
        self.top -= 1
        return self.stack_arr.pop()


取栈顶的元素


取栈顶的数据元素,但是不会影响栈的内容


a1ca9b4464d74dc592de89eb3b0e52bf.png


代码实现


    def gethead(self):
        """得到栈顶的元素"""
        if self.top < 0:
            print("栈以空")
            return
        return self.stack_arr[self.top]


判断栈是否为空


判断栈是否为空


84f8b05b5d8a4d59b6b5941f9247da50.png


代码实现


    def isempty(self):
        """判断栈是否为空"""
        if len(self.stack_arr) == 0:
            return True
        else:
            return False


遍历栈中的所有元素


依次访问栈中的元素


89d895311d6e487294fa95199b2b9997.png


代码实现


def next(self):
        """从栈顶遍历到栈底"""
        for i in self.stack_arr:
            print(i)


清空栈


清空栈中的所有内容


3f35c0dcb6e440bbaa226de0d419fc76.png

代码实现


    def clear(self):
        """清空栈"""
        self.stack_arr.clear()
        self.top = -1


相关文章
|
6天前
|
算法 C语言 C++
【practise】栈的压入和弹出序列
【practise】栈的压入和弹出序列
|
4天前
栈的几个经典应用,真的绝了
文章总结了栈的几个经典应用场景,包括使用两个栈来实现队列的功能以及利用栈进行对称匹配,并通过LeetCode上的题目示例展示了栈在实际问题中的应用。
栈的几个经典应用,真的绝了
|
1天前
|
负载均衡 网络协议 安全
DKDP用户态协议栈-kni
DKDP用户态协议栈-kni
|
1天前
|
负载均衡 网络协议 安全
DPDK用户态协议栈-KNI
DPDK用户态协议栈-KNI
|
1天前
|
测试技术
【初阶数据结构篇】栈的实现(附源码)
在每一个方法的第一排都使用assert宏来判断ps是否为空(避免使用时传入空指针,后续解引用都会报错)。
|
5天前
|
存储 网络协议 Linux
用户态协议栈06-TCP三次握手
用户态协议栈06-TCP三次握手
|
4天前
|
算法
【数据结构与算法】优先级队列
【数据结构与算法】优先级队列
6 0
|
4天前
|
存储 算法
【数据结构与算法】队列(顺序存储)
【数据结构与算法】队列(顺序存储)
5 0
|
5天前
|
存储
全局变量和局部变量在堆和栈的区别
全局变量和局部变量在堆和栈的区别
17 0
|
5天前
|
存储 人工智能 运维
高质量存储力发展问题之浪潮信息发布的大模型智算软件栈的定义如何解决
高质量存储力发展问题之浪潮信息发布的大模型智算软件栈的定义如何解决
10 0