栈的实现及应用

第1关:栈抽象数据类型及其实现

任务描述

本关任务:编写代码实现栈的基本操作。

相关知识

为了完成本关任务,你需要掌握:

  1. 栈抽象数据类型;

  2. Python 中 List 的操作方法。

栈抽象数据类型

抽象数据类型“栈”是一个有次序的数据集。 在栈中,数据项的加入和移除都仅发生在同一端,这一端被称为栈顶,相对地,把另一端称为栈底

距离栈底越近的数据项, 留在栈中的时间就越长,而最新加入栈的数据项会被最先移除。这种次序通常称为“后进先出”( LIFO ):Last in First out。下图是一个栈的抽象模型:

 图1 栈模型

抽象数据类型“栈”定义为如下的操作:

  • Stack()创建一个新的空栈。它不需要参数,并返回一个空栈。

  • push(item)将新项添加到堆栈的顶部。它需要参数 item 并且没有返回值。

  • pop()从栈顶删除项目。它不需要参数,返回 item。栈被修改。

  • peek()返回栈顶的项,不删除它。它不需要参数。堆栈不被修改。

  • is_empty()测试看栈是否为空。它不需要参数,返回一个布尔值。

  • size()返回栈的项目数。它不需要参数,返回一个整数。

List 的操作方法

列表( List )是 Python 中最基本的数据结构。List 中的每个元素都分配有索引,第一个索引是 0,第二个索引是 1,依此类推。

List 可以进行的操作包括增加元素,删除元素,检查成员等。借助 List 的append()pop(),用户可以方便地实现栈的压入和弹出。

编程要求

在右侧编辑器 Begin - End 之间补充代码,使用 List 实现栈。具体要求为:补充完整is_empty()push()pop()size()四个函数,分别实现判断栈是否为空、出栈、入栈和统计栈的项目数四个功能。

测试说明

平台会对你编写的代码进行测试,为了检查栈的定义是否正确,后台会通过 input 接收一个包含数字的字符串,调用定义的栈的操作,分别打印输出栈的长度和栈内的元素:

代码块:

# -*- coding: utf-8 -*-

'''请在Begin-End之间补充代码, 完成Stack类'''
class Stack():
    # 创建空列表实现栈
    def __init__(self): 
        self.__list = []
  
    # 判断是否为空,输出为True或False
    def is_empty(self): 
        # ********** Begin ********** #
        if len(self.__list)==0:
            return  True
        return False
        # ********** End ********** #   
    # 压栈,添加元素
    def push(self,item): 
        # ********** Begin ********** #
        self.__list.append(item)
        # ********** End ********** #  
    # 弹栈,弹出最后压入栈的元素
    def pop(self): 
        # ********** Begin ********** #
       assert not self.is_empty()
       return self.__list.pop()
        # ********** End ********** #  
    # 栈的长度
    def size(self):
        # ********** Begin ********** #
       return len(self.__list)
        # ********** End ********** #      

if __name__ == "__main__":
    stack = Stack() 
    nums = input().split()
    # 将nums中的元素依次入栈
    for num in nums:
        stack.push(num)
    # 打印栈的长度
    print(stack.size())
    # 将栈中元素依次弹出
    while not stack.is_empty():
        print(stack.pop(), end = ' ')

 第2关:栈应用之括号匹配问题

  • 任务描述

    本关任务:编写程序检查该字符串的括号是否成对出现。

    相关知识

    为了完成本关任务,你需要掌握:栈的 Python 实现。栈的相关知识及其实现参见第一关。

    编程要求

    根据提示,在右侧编辑器 Begin - End 之间补充代码,判断字符串是否有效,即字符串中括号是否成对出现。若是,则输出 True ,否则输出 False 。其中字符串的字符只包含三种括号,花括号{}、中括号[]、圆括号(),即它仅由 ()[]{}六个字符组成。

    提示

  • S1:遍历输入的括号序列,如果是左括号,进入S2,如果是右括号,进入S3;

  • S2:如果当前遍历到左括号,则入栈;

  • S3:如果当前遍历到右括号,则出栈一个元素,看其是否与当前的右括号组成一对,如果不是,则匹配失败。或者在出栈过程中发生异常(从空栈中出栈),也匹配失败;

  • S4:若能顺利遍历完成,检查栈中是否还有剩余元素,如果有,则匹配失败;如果没有,则匹配成功。

代码块:

# -*- coding: utf-8 -*-

class Stack():
    # 创建空列表实现栈
    def __init__(self): 
        self.__list = []   
    # 判断是否为空
    def is_empty(self): 
        return self.__list == []
    # 压栈,添加元素
    def push(self,item): 
        self.__list.append(item)
    # 弹栈,弹出最后压入栈的元素
    def pop(self): 
        if self.is_empty():
            return 
        else:
            return self.__list.pop() 
    def gettop(self):    #取栈顶元素
        assert not self.is_empty()  # 检测栈为空
        return self.__list[-1]
        
'''请在Begin-End之间补充完成代码, 完成syntaxChecker函数, 解决括号匹配问题'''
def syntaxChecker(strList):
    ### strList: 字符串列表
    stack = Stack()
    left = '([{'     # 左括号
    right = ')]}'    # 右括号
    flag = True      # 标志位
    # ********** Begin ********** #
    i=0
    while i < len(strList):
        e = strList[i]
        if e in left:
            stack.push(e)  
        else:
            for j in range(3):
                if e == right[j]:
                    if stack.is_empty() or stack.gettop() != left[j]:
                        return False
                    stack.pop()
                j += 1
        i += 1
    flag=stack.is_empty( )
    # ********** End ********** # 
    return flag

if __name__ == "__main__":
    strList = input().split()
    result = syntaxChecker(strList)
    print(result)

 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值