数据结构1—栈与队列

栈与队列都属于动态集合,这两种数据结构的不同之处在于取出数据的次序不同。

栈是一种特殊的线性表,仅能在线性表的一端操作,栈顶允许操作,栈底不允许操作。换言之,栈支持对数据按后进先出(LIFO)的次序取出,先进入的数据被压入栈底,最后插入的数据在栈顶。需要读取数据时先从栈顶弹出数据,数据的放入和取出叫做入栈(或者压栈)和出栈(或者弹栈)。

想象一下:你现在有《西游记》、《红楼梦》、《水浒传》、《三国演义》四本书,你想把它们放进一个箱子里。当你按照刚才的顺序一本一本的堆放进箱子里时,你会发现《西游记》一定是被你压在箱底而《三国演义》一定在最上面。当你想要拿出《西游记》时,你必须要先拿出《三国演义》,再拿出《水浒传》,然后是《红楼梦》,最后是《西游记》。这种就是后进先出,很类似栈的操作。

队列

队列是一种只允许在一端进行插入操作,而在另一端进行删除操作的线性表,它支持对数据按先进先出(FIFO)的次序取出,允许插入的一段为队尾,删除的一端为队头。

想想一下:你现在在肯德基排队取餐,那一定是按照先来后到的顺序,排在第一位的人先取餐先离开队列,而你要是想取餐,只能在队尾开始排队。

C++和Java里面都有封装好的栈与队列库文件,下面我们用Python中的列表来模拟一次栈与队列的操作:

class Stack():
    def __init__(self):        # 初始化栈
        self.lists = []

    def is_empty(self):        # 判断是否为空栈
        return len(self.lists)==0

    def sizes(self):           # 返回栈的长度
        return len(self.lists)

    def top(self):             # 取栈顶元素
        if len(self.lists)==0:
            return None
        else:
            return self.lists[len(self.lists)-1]

    def push_in(self,item):    # 入栈
        return self.lists.append(item)

    def push_out(self):        # 出栈
        if len(self.lists)==0:
            pass
        else:
            return self.lists.pop()
class Queue():
    def __init__(self):        # 初始化队列
        self.lists = []
        self.front = 0         # 队列头
        self.rear = 0          # 队列尾
        
    def is_empty(self):        # 判断是否为空队列
        return len(self.lists)==0

    def sizes(self):           # 返回队列长度
        return len(self.lists)

    def first(self):           # 取队列头元素
        if len(self.lists)==0:
            return None
        else:
            return self.lists[self.front]

    def last(self):            # 取队列尾元素
        if len(self.lists)==0:
            return None
        else:
            return self.lists[self.rear-1]

    def push_in(self,item):    # 入队列
        self.lists.append(item)
        self.rear += 1

    def push_out(self):        # 出队列
        if self.rear <= self.front:
            pass
        else:
            self.lists.pop(self.front)
            #self.front += 1
            self.rear -=1

下面我们来运行实现一下栈与队列的一些操作。在代码中,我们以让1到5的数字分别进入栈和队列为例:

if __name__ == "__main__":
    stack = Stack()
    queue = Queue()
    print("是否为空栈?",end = " ")
    print(stack.is_empty())
    print("是否为空队列?",end = " ")
    print(queue.is_empty())
    for i in range(1,6):
        stack.push_in(i)        # 1,2,3,4,5
        queue.push_in(i)        # 1,2,3,4,5
    stack.push_out()            # 此时栈为1,2,3,4
    queue.push_out()            # 此时队列为2,3,4,5
    print("栈顶:",end = "")
    print(stack.top())
    print("队首:",end = "")
    print(queue.first())
    print("队尾:",end = "")
    print(queue.last())

运行结果如下:

是否为空栈? True
是否为空队列? True
栈顶:4
队首:2
队尾:5

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值