基础数据结构:链表&栈&队列

本文介绍了链表的插入操作,以及如何用链表模拟约瑟夫环问题。同时探讨了栈(后进先出)和队列(先进先出)的概念及其在括号匹配、表达式求值等问题中的应用,还涉及了Python中的deque双端队列在机器翻译中的使用。
摘要由CSDN通过智能技术生成

链表:
链表可以快速插入和删除元素,用于存储数据。

链表具有指针域和数据域

链表的每个节点维护两部分:指针域和数据域

链表维护head和tail(头和尾)

每次插入元素从tail处插入新元素

用类的定义实现:

对于insert:

self.tail.next=Node(data)表示建立一个新的数据域

self.tail=self.tail.next表示建立一个指针指向这个数据

也可以用数组list模拟:

pop(idx)模拟取出第idx个元素

append(x),insert(idx,x)模拟插入元素x

例题:1.约瑟夫环 - 蓝桥云课 (lanqiao.cn)

(用链表模拟取出元素)

代码:

n,k,m=map(int,input().split())

a=[i for i in range (1,n+1)]

i=k%n-1##初始位置

for j in range (n):

    i=(i+m-1)%len(a)##弹出元素的下标

    print(a.pop(i))

栈:

先进后出(后进先出)的数据结构

每次添加元素放入栈顶,每次取出的元素也是栈顶

也可用list直接模拟:

append(x)##向栈顶添加元素

a.pop()##取出栈顶的元素

a[-1]##获取栈顶的元素

栈:1.括号匹配问题

        2.表达式求值

        3.递归机制的核心

        4.用“先进后出”模拟解决问题

例题:

代码:

n=int(input())

a=list(input())

Flag=True

ls=[]

##左括号入栈 右括号出栈

for i in range (n):

    if a[i]=="(":

        ls.append(a[i])

    else:

        if len (ls)>=1:

            ls.pop()

        else:

            Flag=False

if len (ls)==0 and Flag:

    print("Yes")

else:

    print("No")

1.听说这是一种化学规律? - 蓝桥云课 (lanqiao.cn)

代码:

# 请在此输入您的代码

a=input()

a=a.replace("5","")

a=a.replace("6","9")

a=a.replace("7","")

a=list(a)

ls=[]

for idx,i in enumerate(a):

    ##遇到3入栈,遇到4出栈

    if i=="3":

        ls.append(idx)

    elif i=="4":

        if len(ls)!=0:##判断是否未空

            r=ls.pop()##取出最近的一个3的下标

            a[idx],a[r]=a[r],a[idx]

print("".join(map(str,a)))

队列:
先进先出的数据结构

每次添加的元素放入队尾从队首取出元素

用双端队列(deque)实现

from collections import deque

a=deque(ls)

a.popleft()取出队首元素

a.pop()

a.append()队尾添加元素

a.appendleft()

1.机器翻译 - 蓝桥云课 (lanqiao.cn)

from collections import deque

m,n=map(int,input().split())

a=list(map(int,input().split()))

ls=list()##表示内存

ans=0

ls=deque(ls)

for i in range(n):

    if a[i] in ls:

        continue

    else:

        if 0<=len(ls)<m:

            ls.append(a[i])

            ans+=1

        elif len(ls)==m:

            ls.popleft()

            ls.append(a[i])

            ans+=1

print(ans)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值