Python数据结构实验 栈的实现

本文介绍了如何使用Python编程实现顺序栈和链式栈的基本操作,包括栈的创建、元素的进栈出栈以及栈顶元素获取。同时,还涉及了一个应用实验,设计算法判断字符串是否符合特定的逆序格式。
摘要由CSDN通过智能技术生成

一、实验目的

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

  • 53
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值