第1关:栈抽象数据类型及其实现
任务描述
本关任务:编写代码实现栈的基本操作。
相关知识
为了完成本关任务,你需要掌握:
-
栈抽象数据类型;
-
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)