Python实现的方法有很多种,这里就用列表来实现
栈是一种特殊的线性表,仅能在线性表的一端操作,栈顶允许操作,栈底不允许操作。
栈的特性:后进先出或先进后出。
一、定义一个栈类(Python3实现)
class Inn:
def __init__(self):
self.__inn = []
# 进栈
def push(self, item):
self.__inn.append(item)
# 出栈
def pop(self):
return self.__inn.pop()
# 栈顶元素
def top(self):
return self.__inn[-1]
# 判断栈是否为空
def isEmtpy(self):
return len(self.__inn) == 0
# 栈的大小
def size(self):
return len(self.__inn)
# 清空栈
def clear(self):
self.__inn = []
二、栈的应用地方很多,比如我们最常见的电脑上的撤销操作,其原理就是用栈来实现的。
1.文件的深度遍历(windows)
这里使用的是Python自带的deque模块实现的栈。deque模块详解
import os
import os.path as opath
from collections import deque
def depth_path(path):
# 把目录加入栈
queue = deque()
queue.append(path)
while len(queue): # 栈不为空
# 栈顶元素出栈
top = queue.pop()
childDirs = os.listdir(top)
for item in childDirs:
tmp = opath.join(top, item)
if opath.isdir(tmp):
print("目录:", item)
queue.append(tmp)
else:
print("文件:", item)
2.计算逆波兰式的计算结果,
形如这样的逆波兰式 (4, 13, 5, /, +)先将转为列表[“4”, “13”, “5”, “/”, “+”]
这里利用上面实现的栈类来计算
def calc(list):
# 初始化一个栈
inn = Inn()
for i in list:
# 判断是否符号,是则抛出两个栈顶元素
if i in ('+', '-', '*', '/'):
a = inn.pop()
b = inn.pop()
# a=5, b=13
jss = b + i + a
c = int(eval(jss))
# 再将计算结果进栈
inn.push(str(c))
else:
# 不是则压栈(进栈)
inn.push(i)
# 最后返回栈顶元素则计算结果
return inn.pop()
3.实现一个有min方法的栈
这里我们使用两个栈来实现一个有min方法的栈
class inn_min:
def __init__(self):
# 初始化两个栈,一个用来存放数据,一个专门用来存放最小值
self.__data_inn = Inn()
self.__min_inn = Inn()
# 进栈
def push(self, item):
# 数据栈,正常进栈
self.__data_inn.push(item)
# 最小值栈,判断是否是空栈或栈顶元素是否大于当前值
if self.__min_inn.isEmtpy() or item < self.__min_inn.top():
# 是则将当前的传入的数据进栈
self.__min_inn.push(item)
else:
# 不是则将最小值栈的栈顶取出再压一次,和数据栈保持一致
self.__min_inn.push(self.__min_inn.top())
def pop(self):
# 出栈则同时出
self.__data_inn.pop()
self.__min_inn.pop()
def min_inn(self):
# 求最小值时直接出最小值的栈顶即可
return self.__min_inn.top()