数据结构栈

# coding: utf-8

# In[26]:


## 1、用数组实现一个顺序栈
class IStack:
    
    def __init__ (self):
        self._len = 0
        self._arr = [] # 初始化空数组
    # <summary>
    # 获取栈中实际包含元素的个数
    # </summary>
    def length(self):
        return self._len

    #<summary>
    # 获取栈顶元素
    #</summary>
    def stackTop(self):
        if self._len <= 0:
            raise IndentationError("链表为空")
        return self._arr[-1]

    # <summary>
    # 数据元素入栈
    # </summary>
    def push(self, data):
        self._arr.append(data)
        self._len += 1

    # <summary>
    # 数据元素出栈
    # </summary>
    def pop(self):
        if self._len <= 0:
            raise Exception("链表为空")
        item = self._arr.pop()
        self._len -= 1
        return item

    # <summary>
    # 判断栈中是否包含元素
    # </summary>
    # <returns>如果包含元素返回false,否则返回true.</returns>
    def isempty(self):
        if self._len <= 0:
            return True
        else:
            return False

    # <summary>
    # 从栈中移除所有元素
    # </summary>
    def Clear(self):
        for item in range(self._len):
            self._arr.pop()
        self._len = 0


# In[52]:


class ListNode(object): # 预定义链表类
    def __init__(self, x):
        self.val = x
        self.next = None


# In[53]:


# 用链表实现一个链栈
class LinkedStack:
    def __init__ (self):
        self._arr = None # 初始化链表头
        self._len = 0
    # <summary>
    # 获取栈中实际包含元素的个数
    # </summary>
    def length(self):
        return self._len

    #<summary>
    # 获取栈顶元素
    #</summary>
    def top(self):
        if self._len <= 0:
            raise IndentationError("链表为空")
        return self._arr

    # <summary>
    # 数据元素入栈
    # </summary>
    def push(self, data):
        node = ListNode(data)
        if self._len == 0:
            self._len += 1
            return node
        else:
            node.next = self._arr
        self._len += 1
        return node
    
    # <summary>
    # 数据元素出栈
    # </summary>
    def pop(self):
        if self._len <= 0:
            raise Exception("链表为空")
        item = self._arr.val
        self._arr = self._arr.next
        self._len -= 1
        return item

    # <summary>
    # 判断栈中是否包含元素
    # </summary>
    # <returns>如果包含元素返回false,否则返回true.</returns>
    def isempty(self):
        if self._len <= 0:
            return True
        else:
            return False

    # <summary>
    # 从栈中移除所有元素
    # </summary>
    def Clear(self):
        self._arr = None # 将链表头置空
        self._len = 0


# In[54]:


# 阶乘
n  = 5
for i in range(1, n):
    n *= i
print(n)


# In[55]:


# 斐波那契数列
def fact(n):
    if n == 1:
        return 1
    return n * fact(n - 1)
print(fact(5)) # 120


# In[56]:


# 参考连接, 没有彻底理解
# https://github.com/shiinerise/DataStructuresAndAlgorithms/blob/master/3_%E6%A0%88.md


# In[57]:

def output(stacks, n):
    global minVal, minStack
    stacks[minStack].pop()
    print('移动车厢 %d 从缓冲铁轨 %d 到出轨。' % (minVal, minStack))
    minVal = n + 2
    minStack = -1
    for index, stack in enumerate(stacks):
        if((not stack.isempty()) and (stack.top() < minVal)):
            minVal = stack.top()
            minStack = index

def inputStack(i, stacks, n):
    global minVal, minStack
    beskStack = -1  # 最小车厢索引值所在的缓冲铁轨编号
    bestTop = n + 1  # 缓冲铁轨中的最小车厢编号
    for index, stack in enumerate(stacks):
        if not stack.isempty():  # 若缓冲铁轨不为空
            # 若缓冲铁轨的栈顶元素大于要放入缓冲铁轨的元素,并且其栈顶元素小于当前缓冲铁轨中的最小编号
            a = stack.top()
            # print('stack.top()的类型是', a)
            if (a > i and bestTop > a):
                bestTop = stack.top()
                beskStack = index
        else:  # 若缓冲铁轨为空
            if beskStack == -1:
                beskStack = index
                break
    if beskStack == -1:
        return False
    stacks[beskStack].push(i)
    print('移动车厢 %d 从入轨到缓冲铁轨 %d。' % (i, beskStack))
    if i < minVal:
        minVal = i
        minStack = beskStack
    return True

def rail_road(list, k):
    global minVal, minStack
    stacks = []
    for i in range(k):
        stack = LinkedStack()
        stacks.append(stack)
    nowNeed = 1
    n = len(list)
    minVal = n + 1
    minStack = -1
    for i in list:
        if i == nowNeed:
            print('移动车厢 %d 从入轨到出轨。' % i)
            nowNeed += 1
            # print("minVal", minVal)
            while (minVal == nowNeed):
                output(stacks, n)  # 在缓冲栈中查找是否有需求值
                nowNeed += 1
        else:
            if(inputStack(i, stacks, n) == False):
                return False
    return True

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值