# 【python刷题】关于一个序列的入栈出栈有多少种方式相关

## 讲在前面

[1,2,3,4,5],[4,3,5,1,2]


false


• stack用于模拟进栈和出栈
• cur用于记录使用次数

1、对于4，stack：[1,2,3,4]
2、对于5，stack：[1,2,3,5]
3、对于1，stack：[1,2]，此时cur == len(pushV)而且1 != 2，返回False

popV = [4,3,5,2,1]
pushV = [1,2,3,4,5]
def IsPopOrder(pushV, popV):
stack = []
cur = 0
for pv in popV:
while len(stack) == 0 or pv != stack[-1] and cur < len(pushV):
stack.append(pushV[cur])
cur += 1
if cur == len(pushV) and stack[-1] != pv:
return False
else:
stack.pop()
return True
print(IsPopOrder(pushV,popV))


[1,2,3]的全排列是：[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]

popV = [4,3,5,2,1]
pushV = [1,2,3,4,5]

def permutation(array):
def helper(array, tmp):
if len(tmp) == len(array):
res.append(tmp[:])
return res
for i in array:
if i in tmp:
continue
tmp.append(i)
helper(array, tmp)
tmp.pop()
res = []
tmp = []
helper(array, tmp)
return res

def IsPopOrder(pushV, popV):
stack = []
cur = 0
for pv in popV:
while len(stack) == 0 or pv != stack[-1] and cur < len(pushV):
stack.append(pushV[cur])
cur += 1
if cur == len(pushV) and stack[-1] != pv:
return False
else:
stack.pop()
return True

print(IsPopOrder(pushV,popV))
res = (permutation(pushV))
count = 0
for array in res:
if IsPopOrder(pushV, array):
count += 1
print(count)


import sys

class Solution:
def __init__(self, s):
# s为字符串或list
self.s = s
self.n = len(s)
self.result = []

def all_unstack(self, i, stack, seq):

if i == self.n:
if stack:
top = stack.pop()
seq.append(top)
self.all_unstack(i, stack, seq)
stack.append(top)  # 回溯
seq.pop()
else:
self.result.append(seq[:])
else:
# 对于一个输入元素，可以入栈；可以不入，弹出栈中已有元素
# 入栈
stack.append(self.s[i])
self.all_unstack(i + 1, stack, seq)
stack.pop()  # 回溯

# 出栈
if stack:
top = stack.pop()
seq.append(top)
self.all_unstack(i, stack, seq)
seq.pop()  # 回溯
stack.append(top)

def print_all_sequence(self):
for each in self.result[::-1]:
print(each)

s = [1,2,3,4,5]
solution = Solution(s)
solution.all_unstack(0, [], [])
solution.print_all_sequence()


1. 饭后，姐姐洗碗，妹妹把姐姐洗过的碗一个一个地放进碗橱摞成一摞。一共有n个不同的碗，洗前也是摞成一摞的，也许因为小妹贪玩而使碗拿进碗橱不及时，姐姐则把洗过的碗摞在旁边，问：小妹摞起的碗有多少种可能的方式？
2. 给定n个数，有多少种出栈序列？
3. 一个有n个1和n个-1组成的字串，且前k个数的和均不小于0，那这种字串的总数为多少？
这三个问题具有相同的结构，三个问题是可以互相转化。将姐姐放碗看做入栈操作，将妹妹放碗看做出栈操作。则问题一变为问题二。将入栈操作记为1，出栈记为-1，问题2变为问题3。

## Catalan数

1，1，2，5，14，42，132，429，1430，4862……其递归式如下：
$$h(n)= h(0)*h(n-1)+h(1)*h(n-2) + … +h(n-2)*h(1)+ h(n-1)*h(0)$$
(其中n>=2，h(0) = h(1) = 1)

def catalan(n):
if n==0 or n==1:
return 1
return (4*n-2)*catalan(n-1)/(n+1）


Catalan数在计算机排列组合中占有非常重要的比重,应用非常广泛，应用如下：

posted @ 2021-03-08 14:44  西西嘛呦  阅读(379)  评论(0编辑  收藏  举报