资源简介 (共29张PPT)基础教育精品课栈2 栈的基本操作1 栈的概念与特性3 栈的应用实例学习内容大学论语中庸孟子将4本书依次放入收纳箱中庸大学孟子论语将4本书依次从收纳箱取出弹匣中子弹装弹过程(入栈)文字处理软件的“撤销 ”操作网页浏览器的“ 后退 ”键消毒桶中餐盘的取放中庸大学孟子论语栈的概念栈底:栈顶:中庸大学孟子论语ü 先进后出 、 后进先出ü 有限序列性栈的特性栈底:栈顶:相同点有限序列, 线性表结构, 元素个数是有限的, 可以 是空的, 也可以包含多个 元素。栈是“ 先进后出 ”, 仅在 栈顶 一 端进行入栈或出栈操作;队列是“ 先进先出 ”, 可 以在两端进行操作, 其中队尾 一 端入队, 队首 一 端出队。问题与讨论:栈与队列有什么相同点与不同点?不同点A B CD数组 st 0 1 23DCBA栈的存储top=3 top=2 top= 1 top=0使用数组st来存储栈栈底:栈顶:DCDCBA栈的存储top=3 top=2 top= 1 top=0BA^栈的链式存储结构栈底:栈顶:toptop = - 1st = ['']*4栈的基本操作:建栈3210下标空栈top = top + 1 st[top] = 'A' top = top + 1 st[top] = 'B' top = top + 1 st[top] = 'C' top = top + 1 st[top] = 'D'下标3 2 1top→ 0栈的基本操作:入栈DCBACBABAA3top→ 21 0top→ 32 1 032top→ 1 0① ② ③ ④a = ['A','B','C','D'] for i in a:=DCBA栈的基本操作:入栈3210下标思考: 若栈空则不能出栈, 判断栈空的条件是什么?下标top→ 3210DCBA出栈时栈顶元素取出, 同时top值减1栈的基本操作:出栈 出栈和取出栈顶元素有什么区别? 输出栈顶元素代码如何实现?print(st[top])top == - 1while top > - 1:print(st[top],end="") top = top - 1下标top→ 3210DCBA栈的基本操作:出栈运行结果:DCBA问题与讨论:字母A,B,C按顺序入栈, 请问出栈的顺序可能有哪几种?A,B,CA,C,BB,A,CB,C,AC,B,AC,A,BABC问题与讨论:字母A,B,C按顺序入栈, 请问出栈的顺序可能有哪几种?B,C,AC,B,AC,A,BA,B,CA,C,BB,A,CABC第 一章项目挑战中的“ 用户角色特征值 ”, 把该值 (十进制) 转换成二进制, 采用“ 除 二取余法 ”, 利用栈来存储每次计算得到的余数 。 (6)10 = (110)2222110………………栈的实例:进制转换2 top→1 0 入栈过程 top→2 1 02 6 2 3 2 10栈的实例:进制转换特征值的变化: 6→3→ 1→0… …0……1 ……121 top→ 0010110n= 1 ②n=0 ③n=3 ①2 21 1top→ 0 0top = - 1② ③ ④出栈过程1 0top→210①1栈的实例:进制转换1001102top→10stack = [- 1]* 100top = - 1n = int(input("请输入十进制整数:")) while :x = n % 2top = top + 1n = n // 2while top >= 0:print(stack[top],end="")=栈的实例:进制转换(6×(3+2)-4)÷26×(3+2)-4)÷2 (6×(3+2-4)÷2 )6×)3+2(-4(÷2判断 一 个数学计算式中的括号(只有小括号) 是否匹配。匹配不匹配不匹配不匹配栈的实例:括号匹配括号的数量括号的位置从左往右遍历, 遇到左括号, 入栈, 遇到右括号, 出栈。① 栈空, 出现右括号, 不匹配② 遍历结束, 栈中还有左括号(栈不空), 不匹配 ③ 遍历结束, 栈空, 匹配1.计算式中只关注括号, 忽略其他字符 ( ( ) ) 2.判断左右括号的数量与位置时, 采用栈结构来设计栈的实例:括号匹配第 一 步: 抽象与建模(6×(3+2)-4)÷2top = - 1① ② ③ ④栈的实例:括号匹配第 二 步: 设计算法( ( ))((((1top→ 01top→ 0top→1010该字符是右括号?从左往右遍历结束?该字符是左括号?栈的实例:括号匹配栈空?栈空?N Y不匹配不匹配匹配出栈入栈NNNNYYYY第三步: 编写程序st = [""]* 100; top = - 1 #建栈 flag= True #标记是否有不匹配的情况 s = input("输入计算式:") for i in range(len(s)): #完善代码 if top >= 0: #栈中还有左括号 flag = False if flag: print("括号匹配") else: print("括号不匹配")栈的实例:括号匹配stacklist[] #建立 一 个空栈stacklist.append("A") #字母A入栈stacklist.append("B") #字母B入栈print(stacklist[1]) #输出栈顶元素, 为字母Bprint(len(stacklist)) #输出栈中元素个数, 为2stacklist.pop() #弹出栈顶元素print(len(stacklist)) #输出栈中元素个数, 为1, 是字母A拓展:用列表自带函数和方法实现栈小结与练习1. 编号为1 、 2 、 3 、 4的4列火车, 按顺序开进 一 个栈式 结构的站点 。 开出火车站的顺序有多少种? 请写出所有可能的出栈序列。2. 元素a,b,c,d,e按序入栈, 在所有的出栈序列中, 以d 开 头的出栈序列有哪些?3. 参照十进制转二进制的方法, 编写 一 个将十进制数N 转换为r进制数的程序。4. 如果括号匹配问题中, 既有小括号 、 又有中括号和大 括号, 请你设计算法并编写程序判断括号是否匹配。小结与练习 展开更多...... 收起↑ 资源预览