一、栈 的定义
栈(stack)又名堆栈,它是一种运算受限的线性表。其限制是仅允许在表的一端进行插入和删除运算。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。(做一个形象的比喻:就好比我们用箱子整理课本,全部放进去后,最上面的书叫做栈顶,最下面的书称为栈底;当我们要那最下面的课本时,我们需要把上面的所有书都拿出来才可以,这也就是栈的特性“先进后出”)
二、栈的练习
题目要求: 栈操作
1). 入栈;
2). 出栈:
3). 栈顶元素
4). 栈长度
5). 栈是否为空
具体操作:
stack = [ ] #设置一个空列表
info = """
栈操作
# 1). 入栈;
# 2). 出栈:
# 3). 栈顶元素
# 4). 栈长度
# 5). 栈是否为空
"""
while True:
print(info)
choice = input("请输入选择:")
if choice == '1':
item = input("入栈元素:")
stack.append(item)
print("元素%s入栈成功" %(item))
elif choice == '2‘:
if not stack: # 出栈先判断栈是否为空;
print("栈为空, 不能出栈")
else:
item = stack.pop() # item是弹出的那个元素;
print("元素%s出栈成功" %(item))
elif choice == '3':
if len(stack) == 0:
print("栈为空, 无栈顶元素")
else:
print("栈顶元素为%s" %(stack[-1]))
elif choice == '4':
print("栈长度为%s" %(len(stack)))
elif choice == '5':
if len(stack) == 0:
print("栈为空")
else:
print("栈不为空.")
elif choice == 'q':
print("欢迎下次使用!")
break
else:
print("请输入正确的选择!")
三、判断栈是否为空
stack = [ ]
if stack == [ ]:
print('栈为空')
else:
print("可对栈进行操作")
print(bool([ ]))
print(bool([1,2,3]))
if stack:
print(stack)
else:
print('NULL')
if not stack:
print('null')
四、队列的定义
队列的基本操作:
入队,q.push(x)
出队,q.pop()
访问队首元素,q.front()、访问队尾元素,q.back()
判断队列空,q.empty()
访问队列中的元素个数,q.size()
五、引申(面试题)
在未来的学习中我们还要知道两个最基本的栈和队列的操作----1)用两个栈,实现队列;
分析:
要求通过两个“先进后出”的操作完成“先进先出”的功能。
起初的时候,两个栈都为空,那么只要有元素来,那么默认插入到第一个栈。这是,如果要求删除一个元素,那么元素已经不在栈顶,在第一个栈中肯定无法直接删除了,此时我们发现第二个栈还没有派上用场,这里用到了,把第一个栈中的元素压入到第二个栈中,可以发现原来在第一个栈中栈底的元素已经出现在第二个栈的栈顶上,所以删除的功能就实现了。如果这个时候,“队列”里还有元素,我们还可以继续出队,而且,现在要出队的元素就在第二个栈的栈顶,所以直接出栈即可。
分析到现在,下面给出总结:如果栈2不为空,同时又需要出队,那么顺其自然直接弹出即可。如果栈2为空,那么从栈1中逐个弹出压入,那么完整的实现了先进先出的功能。
2)用两个队列,实现栈:
分析:
起初的时候,两个队列都是空的,那么当“栈”要压入一个元素,我们就默认将该元素压入到队列1中。接下来继续压入剩余的元素。
接下来考虑,如果我们想要弹出一个元素如何操作。栈中要求出栈的为栈顶元素,那么即为最后插入的元素,但是该元素在队列的尾部,必须要求前面的元素出队后才能访问,说到这里,你也就发现思路的:出队前面的元素,到另一个队列中,那么就可以在原队列中弹出唯一的元素了。
现在我们再考虑另一个情况,队列里面还有元素,“栈”又进来了新的元素,那么就将新元素,压入到存在元素的那一个队列中,剩余的操作,上面已经提到了,一样的操作,看图也许就清晰多了。
由于我还没有实验过这里就先不放图片了....