资源简介 (共36张PPT)队列和栈复习浙教版新教材(2019)《数据与数据结构》选择性必修1——3.2+3.3 队列和栈复习一、队列的概念及特性★ 概念:一种先进先出的线性表,允许插入的一端称为队尾,允许删除的一端称为队首。★ 特性: 先进先出、后进后出 有限序列性——队列是一种线性表结构,元素个数有限。队列可以为空。一、栈的概念及特性★ 概念:一种操作受限的线性表,仅允许在表的一端进行插入或删除。进行插入或删除操作的一端称为栈顶,位于栈顶位置的元素称为栈顶元素;相应地,将表的另一端称为栈底,位于栈底位置的元素为栈底元素。★ 特性: 先进后出、后进先出 有限序列性——栈是一种线性表结构,元素个数有限。栈可以为空。课堂练习1.下列事件执行过程与队列特征不相符的是( )A.在汽车加油站排队加油时不允许插队B.当主机运行速度与打印机的打印速度不匹配时,为打印机设置一个打印数据缓冲区C.把书叠放成一摞,最底下的书要最后才能拿出来D.CPU分时系统可以根据用户请求,按顺序快速运行各程序段,实现多用户“同时”工作的假象C课堂练习2.下列事件操作的原理与栈的特征不相符的是( )A.杂技演员表演叠罗汉时,最后上去的人总是第一个下来B.在word、photoshop等文档或图像编辑软件中,执行“撤销”操作C.在火车站排队买票或者在超市排队购票D.多个函数嵌套调用时,按照“后调用先返回”的原则进行C课堂练习3.设栈s的初始状态为空,元素a,b,c,d,e,f,g,依次入栈,入栈和出栈可以交替进行,且7个元素的出栈顺序为b,d,c,f,e,a,g,则栈s的容量至少应该为( )A.1 B.2 C.3 D.4C二、栈和队列的基本操作存储建队入队出队存储建栈入栈出栈存储★ 队列的存储结构:顺序结构存储(线性表结构),可以用数组来实现,也可用链表来实现。 头指针head: 记录队首元素位置 尾指针tail: 记录队尾元素的下一个位置 初始时为空列表时,head和tail 均记录下标为0的位置★ 栈的存储结构:顺序结构存储(线性表结构),可以用数组来实现。 栈顶指针top: 记录当前栈顶元素位置 初始时为空栈时,top值为-1存储建队建队1:head=0tail=0que=[""]*6建栈1:top=-1stack=[""]*6建栈建队2:head=0tail=0que=[0]*6建队3:head=0tail=0que=[]建栈2:top=-1stack=[0]*6建栈3:top=-1stack=[]#入队1for i in “亚洲足球崛起”:que[tail]=itail+=1#入栈1:for i in “亚洲足球崛起” :top+=1stack[top]=i入队入栈#入队2for i in range(1,20,3):que[tail]=itail+=1#入队3for i in range(1,20,3):que.append(i)#入栈2:for i in range(1,20,3) :top+=1stack[top]=i#入栈3:for i in “亚洲足球崛起” :stack.append(i)#出队1、2while head!=tail:print(que[head])head+=1#出栈1、2:while top>-1:print(stack[top])top-=1出队出栈#出队3head=0while len(que)!=0:print(que.pop(head))head+=1#出栈3:while len(stack)!=0:print(stack.pop())top!=-1#建队head=tail=0que=[""]*6#入队for i in “中国男足加油”:que[tail]=itail+=1#出队while head!=tail:print(que[head])head+=1Print(que)#建栈:top=-1stack=[""]*6#入栈:for i in “中国男足加油” :top+=1stack[top]=i#出栈:while top>-1:print(stack[top])top-=1Print(stack)测试1VS#建队head=tail=0que=[]#入队for i in “伊朗真真不错":que.append(i)#出队tail=len(que)while len(que)!=0:print(que.pop(head))print(que)#建栈:top=-1stack=[]#入栈:for i in “伊朗真真不错":stack.append(i)#出栈:while len(stack)!=0:print(stack.pop())print(stack)VS测试2课堂练习3.判断一个长度为n的队列q为空的条件是( )A.head==0 B.tail==0 C.tail==-1 D.head==tailD4. 用python列表模拟队列,并设置队头指针head指向队首元素,队尾指针tail指向队尾元素的下一个位置,则当head=3,tail=6时,队列中元素的个数为( )A.3 B.4 C.5 D.6A课堂练习书P30D课堂练习有如下python 程序段,使用长度为3的列表q模拟队列的出队入队活动:q=[1,2,3]ys=[]for i in range(4,10):ys.append(q[0])q[0]=q[1]q[1]=q[2]q[2]=iprint(ys,q)程序运行结束后,列表ys中元素的数量为___________。6课堂练习例:信息的加密1. 将字符串各字符依次入队,得到队列。s=input(“请输入字符串:”)que=[""]*100head=0tail=0for i in range(len(s)):que[tail]=s[i]tail+=1给定一个字符串S1,S2,…..Sn,按如下过程加密:取出第一个字符S1,将第二个字符S2放到字符串的末尾Sn后面,得到字符串S3…..Sn,S2;接着把S3取出,S4放到字符串的末尾S2后面,直到最后一个字母Sn被取出。这些字母按取出的顺序形成一个新的字符串,称为密串,请编写一个加密程序,输入一个字符串(长度小于等于100),输出该字符串的密串。2. 以 “STRING”为例,该字符串压入队列后先取出队首元素“S”并输出,同时head+1,队首元素变为“T”再取出“T”,加入到队尾,队首变为“R”,队尾变为“T”,head和tail均加1重复以上操作,直至队列为空队列 que索引 0 1 2 3 4 5 6 7 8 9 10 11headtailSTRING取出ST取出RI取出NG取出TI取出GI取出Ihead=tail队列清空用数组(列表)模拟的队列真的清空了么?程序运行结束后,输出的内容是( )课堂练习有如下Python程序段:a=[0]*5b=["A","B","C","D","E"]top=-1while top<4:top=top+1if top%2==0:a[top]=b[top]else:a[top]=topfor i in range(2):a.pop()top=top-1print(a,top)DA.[“A”,”B”,”C”]3 B.[“A”,”B”,”C”]2C.[“A”,1,”C”]3 D.[“A”,1,”C”]2课堂练习在利用栈来判断一个表达式中的括号(只有小括号)是否匹配的过程中,当遇到表达式中的一个左括号时,就让它进栈,遇到一个右括号时,就对栈进行一次出栈操作,当栈最后为空时,表示括号是配对的,否则是不配对的,现有表达式“(a+b)*c+((d-e)*f+g)*h”,针对该表达式设计栈的大小,至少为( )A.1 B.2 C.3 D.4B课堂练习st-=[""]* 100 ; top=-1flag=True #标记是否有不匹配的情况s=input("请输入数学计算式: ")for i in range(len(s)):if s[i]=="(":________________________elif s[i]== ")":if top==-1:____________breakelse:____________if top>=0: flag=False #栈中还有左括号if flag: print("括号匹配”)else: print("括号不匹配")top=top+1st[top]=s[i]flag=Falsetop=top-1课堂练习将一个十进制数转换为二进制数,根据入栈、出栈的步骤,采用Python编写的完整程序及测试结果如下所示:st=[-1]*100 #列表中元素初始值为-1top=-1number=int(input(“请输入十进制整数:”))while number>0:x=number%2top=top+1st[top]=x #入栈number=number//2while top>=0:print(st[top],end=“”) #出栈top=top-1请输入十进制整数:13输出:1101字符串的实现方法?空列表的实现方法?数组?算法思想: 1)用栈结构存放每次获得的余数2)根据栈特征输出每次获得的余数课堂练习下列代码段能够实现分离正整数,并输出其各位数字(用空格隔开)的功能。请在划线处填入合适的代码。st=[0]* 10 #创建一个空栈top=-1num=int(input(“请输入一个正整数:"))while num>0:①st[top]= ②num=num//10print("输出结果为:",end="")while top>-1:print( ③,end=" ")top-=1top+=1num%10st[top]课堂练习给定一个字符串,删除相邻重复项。例如,字符串“accdbbdca”删除相邻重复项的结果为“aca”。实现上述功能的python程序如下:S=input(“请输入一个字符串:”)stack=[] #定义一个栈for i in S:if _____________: #如果当前栈为空stack.append(i)elif i==stack[-1]: #如果当前元素与栈顶元素相等________ #删除else:_________print(stack)(1)当输入的字符串为“hdjjsaad”时,输出的stack的值为__________。(2)请在划线处填入合适的代码。[‘h’,’d’,’s’,’d’]stack==[ ]stack.pop()stack.append(i)字符串的实现方法?【举一反三1】有如下Python程序段:num=int(input(“请输入一个整数[-128,127]:”))st=[]if num>=0:for i in range(7):st.append(str(num%2))num//=2st.append("0")else:num=-numfor i in range(7):st.append(str(1-num%2))num//=2st.append("1")print(".join(st[::-1]))则当输入26时,程序输出结果为( )A.10011010 B.11100101 C.0001 1010 D.11010C练一练【举一反三2】有如下Python程序段:s="0123456789ABCDEF“a=“1A2B”ans=[]for ch in a:num=s.index(ch)st=[]for i in range(4):st.append(str(num%2))num//=2ans.append(".join(st[::-1]))print(".join(ans))则程序执行后,输出的结果为( )A .0001101000101011 B.1101000101011C.100001010100110 D.11010101011A练一练【举一反三3】有如下Python程序段:if__name__==__main__st=LinkStack()num=72while num>0:st.push(num%2)num//=2while not st.is_empty():print(st.pop(),end="")则程序输出结果为_________________。1001000练一练三、循环队列头啊付月月章鼎昊李帅宋炜涛陈悦head=0tail=6head=6定义的列表是否为空?是否能入队?循环队列: 将队列的队首和队尾连接起来,形成逻辑上的环状结构。当对循环队列中的元素进行入队、出队操作时,队首指针变量和队尾指针变量可以循环指向所有位置,从而有效地解决队列中“有空闲位置却不能入队”的问题。尝试设计三、循环队列#建队head=tail=0que=[""]*6#入队for i in [“头啊“, “付月月“, ”章鼎昊“, ”李帅“, ”宋炜涛“, ”陈悦“]:que[tail]=itail+=1#出队while head!=tail:print(que[head])head+=1付月月章鼎昊李帅宋炜涛陈悦头啊#建队head=tail=0que=[""]*6#入队for i in [“头啊“, “付月月“, ”章鼎昊“, ”李帅“, ”宋炜涛“, ”陈悦“]:que[tail]=itail=(tail+1)%len(que)#出队while :print(que[head])head=(head+1)%len(que)三、循环队列数组中预备一个空闲单元import random#建队head,tail=0,0que=[0]*6#入队While head!=(tail+1)%len(q):q[tail]=random.randint(1,9)tail=(tail+1)%len(q)#出队while head!=tail:print(que[head])head=(head+1) %len(q)三、循环队列课堂练习C课堂练习已知队列元素的个数为6,则队首指针head和队尾指针tail的值不可能的是( )A.head=0,tail=6 B. head=6,tail=0C. head=3,tail=2 D. head=3,tail=8D10课堂练习课堂练习(head+1)% n或其他等价答案q[tail]=q[head]c=0课堂练习例:信息的加密的循环队列实现1. 将字符串各字符依次入队,得到队列。s=input(“请输入字符串:”)que=[""]*100head=0tail=0for i in range(len(s)):que[tail]=s[i]tail+=1给定一个字符串S1,S2,…..Sn,按如下过程加密:取出第一个字符S1,将第二个字符S2放到字符串的末尾Sn后面,得到字符串S3…..Sn,S2;接着把S3取出,S4放到字符串的末尾S2后面,直到最后一个字母Sn被取出。这些字母按取出的顺序形成一个新的字符串,称为密串,请编写一个加密程序,输入一个字符串(长度小于等于100),输出该字符串的密串。2. 以 “STRING”为例,该字符串压入队列后先取出队首元素“S”并输出,同时head+1,队首元素变为“T”再取出“T”,加入到队尾,队首变为“R”,队尾变为“T”,head和tail均加1重复以上操作,直至队列为空谢谢配合浙教版新教材(2019)《数据与数据结构》选择性必修1——3.2+3.3 队列和栈复习 展开更多...... 收起↑ 资源预览