<p><strong>普通列表和普通函数</strong></p>
<p>如果您只需要实现一个堆栈,我认为没有理由使用<code>collections.deque</code>。我们可以很容易地构建一个简单的列表,<code>[]</code>-</p>
<pre class="lang-py prettyprint-override"><code># stack.py
def empty():
return []
def push(t, x):
t.append(x)
def pop(t):
return t.pop()
def load(t, iterable):
for x in iterable:
push(t, x)
def unload(t):
while t:
yield pop(t)
</code></pre>
<p>使用堆栈很直观-</p>
<pre class="lang-py prettyprint-override"><code># main.py
import stack
input = "we have not defeated corona"
s = stack.empty()
stack.load(s, input)
output = "".join(stack.unload(s))
print(output)
</code></pre>
<pre class="lang-none prettyprint-override"><code>anoroc detaefed ton evah ew
</code></pre>
<hr/>
<p><strong>让它感觉更像python</strong></p>
<p>如果您希望<code>stack</code>具有更面向对象的感觉,我们可以在普通函数周围添加一个接口-</p>
<pre class="lang-py prettyprint-override"><code># stack.py (continued)
class stack:
def empty(): return stack(empty())
def __init__(self, t): self.t = t
def push(self, v): return push(self.t, v)
def pop(self): return pop(self.t)
def load(self, iterable): return load(self.t, iterable)
def unload(self): return unload(self.t)
</code></pre>
<p>现在我们可以这样写<code>main</code></p>
<pre class="lang-py prettyprint-override"><code># main.py
from stack import stack
input = "we have not defeated corona"
s = stack.empty()
s.load(input)
output = "".join(s.unload())
print(output)
</code></pre>
<pre class="lang-none prettyprint-override"><code>anoroc detaefed ton evah ew
</code></pre>
<hr/>
<p><strong>展开堆栈模块</strong></p>
<p>继续向堆栈模块添加其他功能-</p>
<pre class="lang-py prettyprint-override"><code># stack.py (continued)
def reverse(t):
t.reverse()
def peek(t):
if not t:
return None
else:
return t[-1]
</code></pre>
<p>在面向对象的界面中包装新函数-</p>
<pre class="lang-py prettyprint-override"><code># stack.py (continued)
class stack:
def empty(): ...
def __init__(): ...
def push(): ...
def pop(): ...
def load(): ...
def unload(): ...
def reverse(self): return reverse(self.t) # <-
def peek(self): return peek(self.t) # <-
</code></pre>
<p>让我们验证一下<code>seek</code>和<code>reverse</code>是否正常工作-</p>
<pre class="lang-py prettyprint-override"><code># main.py
from stack import stack
input = "we have not defeated corona"
s = stack.empty()
s.load(input)
print(s.peek())
s.pop()
print(s.peek())
s.reverse()
print(s.peek())
</code></pre>
<pre class="lang-none prettyprint-override"><code>a
n
w
</code></pre>
<hr/>
<p><strong>相关阅读</strong></p>
<p>在<a href="https://stackoverflow.com/q/65495898/633183">recent Q&A</a>中,我展示了如何设计类似于上面<code>stack</code>的模块。如果您想了解随着程序的发展如何应用此技术,我鼓励您查看post:D</p>
<hr/>
<p><strong>持久堆栈</strong></p>
<p>作为一个有趣的练习,我们可以在不使用<code>deque</code>、一个<code>list</code>或任何其他内置数据容器的情况下实现堆栈。相反,我们将使用普通的<code>None</code>和匿名函数。我分享这个例子是为了让你意识到程序员可以在他们的想象中构建任何东西,即使你使用的语言不包含特定的功能-</p>
<pre class="lang-py prettyprint-override"><code># stack.py
empty = None
def push(t, v):
return lambda k: k(t, v)
def pop(t):
if not t:
raise RuntimeError("cannot pop empty stack")
else:
return t(lambda next, v: (next, v))
def load(t, iterable):
for v in iterable:
t = push(t, v)
return t
def unload(t):
while t:
(next, v) = pop(t)
yield v
t = next
def reverse(t):
return load(empty, unload(t))
def peek(t):
if not t:
return None
else:
(_, v) = pop(t)
return v
class stack:
def empty(): return stack(empty)
def __init__(self, t): self.t = t
def push(self, v): return push(self.t, v)
def pop(self):
(next, v) = pop(self.t)
return (stack(next), v)
def load(self, iterable): return stack(load(self.t, iterable))
def unload(self): return unload(self.t)
def reverse(self): return stack(reverse(self.t))
def peek(self): return peek(self.t)
</code></pre>
<p>每个堆栈操作都创建一个<em>新的</em>堆栈,而不是使用<code>.append</code>、<code>.pop</code>或<code>.reverse</code>修改底层堆栈。请注意,如果需要,我们可以<code>unload</code>两次(或更多次)调用堆栈-</p>
<pre class="lang-py prettyprint-override"><code>from stack import stack
input = "we have not defeated corona"
s = stack.empty().load(input)
print("".join(s.unload()))
print("".join(s.reverse().unload()))
print("".join(s.unload()))
</code></pre>
<pre class="lang-none prettyprint-override"><code>anoroc detaefed ton evah ew
we have not defeated corona
anoroc detaefed ton evah ew
</code></pre>