栈作为一种数据结构,是一种只能在一端进行插入和删除操作。它按照先进后出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来)。

栈的应用场景:
- 内存管理中使用的堆栈;
- 基于栈实现的二叉树的遍历;
语言处理中,符号的平衡问题。
在语言中,往往很多符号是成对出现的,比如<>,{},[],()等,如何判断符号是否漏了,一种实现方式就是:假设在读入一串字符串以后,如果遇到对称符号的左边部分,则将其压入栈中,当遇到对称符号的右边部分,则弹出栈中的一个对象,如果所有的符号都是平衡的,栈中此时应该就是为空,通过判断栈中是否为空,说明字符串是否是符号平衡的。
栈的设计
首先,需要定义一个实例属性top,三个实例方法:获取栈顶元素——peek(); 出栈——pop(); 入栈——push();
实例属性:self.top 要先找到一个基准
实例方法:
入栈 push()
一个指针,一个节点。指针永远指向当前栈顶。
当入栈时,将当前指针的值付给入栈节点的next,指针指向入栈节点。出栈 pop()
出栈时,返回当前指针的值,指针指向下一个节点。
1 | # 定义节点 |
1 | # 用列表实现堆栈 |
队列的设计
队列是按照先进先出的原则储存数据,可实现enqueue,dequeue,is_empty,is_full四种方法。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37class Queue:
def __init__(self, size):
self.size = size
self.list = []
def enqueue(self, item):
if self.is_full():
print('队列已满')
else:
self.list.append(item)
def dequeue(self):
if self.is_empty():
print('队列已空')
else:
return self.list.pop(0)
def is_full(self):
if len(self.list) == self.size:
return True
return False
def is_empty(self):
if len(self.list) == 0:
return True
return False
s = Queue(2)
print(s.is_empty())
s.enqueue(1)
s.enqueue(2)
print(s.is_full())
print(s.dequeue())
print(s.dequeue())
print(s.is_empty())
用栈来实现队列的功能
1 | class Stack: |