一、实验目的
1.掌握用Python定义栈的顺序存储结构和链式存储结构,以便在实际背景下灵活运用;
2.掌握栈的特点,即先进后出的原则;
3.掌握栈的基本操作实现方法。
二、实验环境
1.Windows操作系统的计算机
2.Python3.7环境平台和PyCharm编辑器
三、实验说明
1.实现栈的顺序存储结构和链式存储结构的基本操作。
2.注意进栈、出栈时栈顶指针都要改变。
3.实验中如无特别说明,均要求使用脚本(.py)方式编写代码。
4.自主编写程序,必要时参考相关资料。
5.实验学时:2学时
四、实验内容和步骤
1.实验内容
(1) 基础实验题
设计整数顺序栈的基本运算程序,并用相关数据进行测试。
参考框架:
#顺序栈
class SqStack:
def __init__(self): #构造函数
……
def empty(self): #判断栈是否为空
……
def push(self, e): #元素e进栈
……
def pop(self): #元素出栈
……
def gettop(self): #取栈顶元素
……
#主程序(给下面每条语句做注释,解释实现功能)
if __name__ == '__main__':
print()
print(" 创建空顺序栈st")
_
print(" st:","空" if st.empty() else "不空")
print(" 进栈1-4")
_
_
_
_
print(" st:","空" if st.empty() else "不空")
print(" 出栈顺序:",end=' ')
while not st.empty():
_
print()
print(" st:","空" if st.empty() else "不空")
print()
(2) 应用实验题
给定一个字符串str,设计一个算法采用顺序栈判断str是否为形如“序列1@序列2”的合法字符串,其中序列2是序列1的逆序,在str中恰好只有一个@字符。
参考框架:
from SqStack import SqStack #导入上题定义的类
def match(str):
st=SqStack() #定义一个顺序栈
i=0
while i<len(str) and str[i]!='@':
st.push(str[i])
_
if _ : #没有找到@,返回false
return False;
i+=1 #跳过@
while i<len(str) and not st.empty(): #str没有扫描完毕并且栈不空循环
if _ : #两者不等返回false;
return False
i+=1
if _ and _ : #str扫描完毕并且栈空返回true
return True
else: #其他返回false
return False
#主程序(给下面每条语句做注释,解释实现功能)
print("测试1")
str=" "
if match(str):
print(str+":Yes")
else:
_
print("测试2")
str=" "
if match(str):
_
else:
print(str+":No")
2.实验步骤
(1)分析实验内容,写出程序大致框架或完整的程序代码。
(2)进入Python集成环境。
(3)编辑程序并进行保存。
(4)运行程序,若有错误,修改错误后再次运行,如此反复进行到不显示出错为止。
(5)检查程序输出结果。
五、实验代码与结果(程序运行代码及其结果)
1. (1)给出算法的基本设计思想。
(2)根据设计思想,采用Python语言描述算法,关键之处给出注释。
class SqStack:
def __init__(self): #构造函数
self.data=[]
def empty(self): #判断栈是否为空
if len(self.data)==0:
return True
return False
def push(self, e): #元素e进栈
self.data.append(e)
def pop(self): #元素出栈
assert not self.empty()
return self.data.pop()
def gettop(self): #取栈顶元素
assert not self.empty()
return self.data[-1]
#主程序(给下面每条语句做注释,解释实现功能)
if __name__ == '__main__':
print()
print(" 创建空顺序栈st")#输出字符串 "创建空顺序栈st"。
st=SqStack()#创建一个名为 st 的顺序栈对象,调用 __init__() 方法初始化栈内部的数据列表 data。
print(" st:","空" if st.empty() else "不空")#如果 st 栈为空,输出字符串 "空";否则输出字符串 "不空"。
print(" 进栈1-4")
for i in range(1,5):#将整数 1~4 依次入栈。
st.push(i)
print(" st:","空" if st.empty() else "不空")
print(" 出栈顺序:",end=' ')#:输出字符串 "出栈顺序:",设置 end 参数为一个空格,表示输出完这个字符串后不换行。
while not st.empty():#当栈 st 不为空时,执行循环体。每次将栈顶元素出栈,并输出该元素,设置 end 参数为一个空格,表示输出完这个元素后不换行。
print(st.pop(), end=' ')
print()
print(" st:","空" if st.empty() else "不空")
print()
2. (1)给出算法的基本设计思想。
(2)根据设计思想,采用Python语言描述算法,关键之处给出注释。
from SqStack import SqStack # 导入上题定义的类
def match(s):
st = SqStack() # 定义一个顺序栈
i = 0
while i < len(s) and s[i] != '@':
st.push(s[i])
i += 1
if i == len(s): # 没有找到@,返回false
return False
i += 1 # 跳过@
while i < len(s) and not st.empty(): # str没有扫描完毕并且栈不空循环
if s[i] != st.pop(): # 两者不等返回false
return False
i += 1
if i == len(s) and st.empty(): # str扫描完毕并且栈空返回true
return True
else: # 其他返回false
return False
#主程序(给下面每条语句做注释,解释实现功能)
print("测试1")
s = "abcde@edcba"# 初始化字符串 s
if match(s):
print(s + ": Yes")
else:
print(s + ": No")# 如果 s 是符合要求的字符串,则打印 "Yes";否则打印 "No
print("测试2")
s = "abcde@edcbea"
if match(s):# 初始化字符串 s
print(s + ": Yes")
else:
print(s + ": No")# 如果 s 是符合要求的字符串,则打印 "Yes";否则打印 "No