内容正文:
栈的概念及基本操作
栈是一种操作受限的线性表,仅允许在表的一端进行插入或删除。
进行插入或删除操作的一端称为栈顶,
位于栈顶位置的元素称为栈顶元素;
相应地,将表的另一端称为栈底,
位于栈底位置的元素为栈底元素。
栈底元素
栈顶元素
栈的概念
栈的特征
栈的概念和特性
1.有六个元素按照6,5,4,3,2,1的顺序依次进栈,则出栈顺序不可能是( )
5,4,3,6,1,2
4,5,3,1,2,6
3,4,6,5,2,1
2,3,4,1,5,6
2. 一个栈的入栈序列是1,2,3,4,5,其出栈序列为s1,s2,s3,s4,s5,若s2是3,则s1不可能是( )
A. 1 B. 2 C. 4 D. 5
C
D
练习
·栈一般按顺序结构存储的,可以用数组来实现,而在Python语言中,可以用列表实现。
例:有4个字母“A”“B”“C”“D”按序入栈
A B C D
0 1 2 3
栈底:
top
D
C
B
A
栈顶: top=3
栈结构
数组st的下标:
数组存储栈
栈的基本操作
·栈一般按顺序结构存储的,可以用数组来实现,而在Python语言中,可以用列表实现。
栈底:
4
3
2
1
栈顶: top=3
栈结构
例:有4个数字1 2 3 4按序入栈
栈的基本操作
建栈:
用数组模拟
st = [""]*6
top = -1
栈一般按顺序结构存储,
因此数组模拟在
算法中更常见。
栈的基本操作
N-1
N-2
…
2
1
0
top = top+1
stack[top] = “语文”
栈的基本操作
·入栈(又称压栈操作)
栈
top=-1
top +=1
st[top] = “A”
top +=1
st[top] = “B”
top +=1
st[top] = “C”
top +=1
st[top] = “D”
st
top=-1
top
A
B
C
D
字母A、B、C、D依次入栈
栈的基本操作
·入栈(又称压栈操作)
栈
top=-1
top +=1
st[top] = “A”
top +=1
st[top] = “B”
top +=1
st[top] = “C”
top +=1
st[top] = “D”
字母A、B、C、D依次入栈
top=-1
st=[""]*4
s=["A","B","C","D"]
for i in s:#所有字母依次入栈
__________
__________
top=top+1
st[top]=i
栈的基本操作
出栈
出栈时把栈顶元素取出,同时top减1,
当top为-1时,表示栈为空。
st
top=-1
top
A
B
C
D
top=3 #初始值
st[top]=””
top=top-1
st[top]=””
top=top-1
st[top]=””
top=top-1
st[top]=””
top=top-1
栈的基本操作
出栈
出栈时把栈顶元素取出,同时top减1,
当top为-1时,表示栈为空。
top=3 #初始值
st[top]=””
top=top-1
st[top]=””
top=top-1
st[top]=””
top=top-1
st[top]=””
top=top-1
st=["A","B","C","D"]
top=3
while __________:#所有字母依次出栈
print(st[top])
__________
top!=-1
top-=1
栈的基本操作
N-1
N-2
…
2
1
0
top = top+1
stack[top] = “语文”
print(stack[top])
top = top-1
判断空栈条件:
栈中元素个数:
top==-1
top+1
栈的基本操作
st=[-1]*100 #列表中元素初始值-1
top=-1
number=int(input("请输入十进制整数: "))
while number>0:
x=number % 2
______________
______________ #入栈
number=number // 2
while top>=0:
print(st[top],end="") #出栈
______________
top=top+1
st[top]=x
top=top-1
栈的基本应用---十进制转二进制
项目:括号匹配问题
章节副标题
01
栈的基本应用---括号匹配
第六次
python在处理数学计算式时,用小括号“()”来提高运算的优先级,但有时由于用户的疏忽,会缺少左/右括号,因此我们希望能用计算机编程来解决括号的匹配问题。
项目描述——
s = “((2+3×(5-4))-10)×2”
(
第一次
(
第二次
(
(
第三次
(
(
(
第四次
(
(
第五次
(
(
(
)
)
)
匹配成功!
第六次
s = “((2+3×(5-4))-10)×2”
第一次
(
第二次
(
(
第三次
(
(
(
第四次
(
(
第五次
(
扫描过程中,栈空,出现右括号->不匹配
运用栈结构实现括号匹配的三种情况
扫描结束,栈中还有左括号->不匹配
扫描结束,栈空->匹配
练习
st=[""]* 100
top=-1
flag=True #标记是否有不匹配的情况
s=input("请输入数学计算式: ")
for i in range(len()):
if s[i]=="(":
____________
____________
elif s[i]== ")":
if top==-1:
____________
break
else:
____________
iftop>=0: #栈中还有左括号
flag=False
if flag:
print("括号匹配”)
else:
print("括号不匹配")
top=top+1
st[top]=s[i]
flag=False
top=top-1
判断是否匹配,分下列3种情况:
栈空,出现右括号,不匹配。
扫描结束,栈中还有左括号,不匹配。
扫描结束,栈空,匹配。
➄遇左括号☞入栈
栈顶指针top值加1,并将其压入栈中。
➃从左往右逐步扫描数学计算式字符串
➂遇右括号
top>-1,栈非空,栈顶左括号弹出,top-1‘(’出栈
top==-1,栈为空,没有与右括号相匹配的左括号,记录标记
➁扫描完毕
栈中还有左括号(非空)判断不匹配,记录标记
➀初始化栈
➅判断标记
输出“匹配“或“不匹配”
➆输入数学计算式
➆➀➃➄➂➁➅
两人一组讨论算法的顺序应为何?为什么?
⏰
设计算法
编写程序:用固定数组模拟栈实现括号匹配
拼接代码游戏
1、根据前页中的算法顺序,请从“栈”文件中选出正确顺序的代码,将序号写在学案上。
2、点击开始的python“IDLE”软件,点击“File”,在”New File”区域复制粘贴你所选择的代码。
3、注意语法格式、缩进、以及中英文输入法等。
4、调试运行,输入以下三个例子,与结果对应即为调试成功——(按F5运行,每次测试都需运行程序)
输入: ((()))() 输出:括号匹配
输入: ((())() 输出:括号不匹配
输入: (()))()() 输出:括号不匹配
st = [""]*100
top = -1 #➀
flag=True #➃
s=input("请输入数学计算式:")
if s[i] == "(": #➂
top = top+1
st[top] = s[i]
elif s[i] == ")":
if top == -1:#➁
flag=False
break
else:
top=top-1
for i in range(len(s)):#➄
if top >= 0: #➆
flag=False
if flag: #➅
print("括号匹配")
else:
print("括号不匹配")
$