栈和队列
1 栈
1.1 栈的定义
**栈(stack)**是限定仅在表尾进行插入或者删除的线性表。
对于栈来说,表尾端称为栈顶(top),表头端称为栈底(bottom)。不含元素的空表称为空栈。
因为栈限定在表尾进行插入或者删除,所以栈又被称为后进先出的线性表(简称**LIFO:Last in, First out.**结构)。
栈的基本操作主要有:栈的初始化、判空、取栈顶元素、在栈顶进行插入和删除。在栈顶插入元素称为入栈,在栈顶删除元素称为出栈。
1.2 代码实现
![0039NKUNGJ%SO8NO8EIKaTeX parse error: Undefined control sequence: \Users at position 8: M7E](C:\̲U̲s̲e̲r̲s̲\ALANSHAO\Deskt…M7E.png)
1.2.1 栈类实现
class Stack:
def __init__(self):
self.items = []
def isEmpty(self):
return self.items == []
def push(self, item):
self.items.append(item)
def pop(self):
return self.items.pop()
def peek(self):
return self.items[len(self.items) - 1]
def size(self):
return len(self.items)
s = Stack()
s.isEmpty()
True
s.push(4)
s.push('dog')
s.peek()
'dog'
s.size()
2
s.push(8.5)
s.push('aa')
s.size()
4
s.isEmpty()
False
s.pop()
'aa'
1.3 应用案例
1.3.1 匹配括号
检测括号匹配正确与否
def parChecker(symbolstr):
s1 = Stack()
for i in range(len(symbolstr)):
if(symbolstr[i] == '('):
s1.push(symbolstr[i])
elif(symbolstr[i] == ')'):
s1.pop()
if(s1.isEmpty()):
return True
else:
return False
parChecker('(()((())))')
1.3.2 十进制数转化二进制
将十进制数233转化为对应二进制数11101001
def conver(decNumber):
if(decNumber >= 0):
x = decNumber
res = 0
s = Stack()
while x != 0:
res = x % 2
s.push(res)
x = x // 2
restr = ''
while not s.isEmpty():
restr = restr + str(s.pop())
return restr
else:
print('wrong input')
conver(233)
2 队列
2.1 队列的定义
队列(Queue),队列简称队。
是一种操作受限的线性表,只允许在表的一端进行插入,而在表的另一端进行删除。向队列中插入元素称为入队或进队;删除元素称为出队或离队。
其操作特性为先进先出(First In First Out,FIFO),并且只允许在队尾进,队头出。
**队头(Front):**允许删除的一端,又称队首
**队尾(Rear):**允许插入的一端
**空队列:**不包含任何元素的空表
2.2 代码实现
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kXzCeGCt-1661259235831)(C:\Users\ALANSHAO\AppData\Roaming\Typora\typora-user-images\image-20220823202518234.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fmjbRD5C-1661259235832)(C:\Users\ALANSHAO\AppData\Roaming\Typora\typora-user-images\image-20220823202525955.png)]
2.2.1 队列实现
class Queue:
def __init__(self):
self.items = []
def isEmppy(self):
return self.items == []
def enqueue(self, item):
self.items.insert(0, item)
def deque(self):
return self.items.pop()
def size(self):
return len(self.items)
q = Queue()
q.isEmppy()
True
q.enqueue('dog')
q.enqueue(4)
q.size()
2
q.isEmppy()
False
q.deque()
4
2.2.2 双端队列
双端队列是与队列类似的有序集合。它有一前、一后两端,元素在其中保持自己的位置。
与队列不同的是,双端队列对在哪一端添加和移除元素没有任何限制。
新元素既可以被添加到前端,也可以被添加到后端。同理,已有的元素也能从任意一端移除。
某种意义上,双端队列是栈和队列的结合
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ILgna9mq-1661259235833)(C:\Users\ALANSHAO\AppData\Roaming\Typora\typora-user-images\image-20220823204225942.png)]
class Deque:
def __init__(self):
self.items = []
def isEmpty(self):
return self.items == []
def addFront(self, item):
self.items.append(item)
def addRear(self, item):
self.items.insert(0, item)
def removeFront(self):
return self.items.pop()
def removeRear(self):
return self.items.pop(0)
def size(self):
return len(self.items)
d = Deque()
d.isEmpty()
True
d.addRear(4)
d.addRear('dog')
d.addFront(True)
d.addFront(8.4)
d.size()
4
d.isEmpty()
False
d.removeFront()
8.4
d.size()
3
):
return len(self.items)
```python
d = Deque()
d.isEmpty()
True
d.addRear(4)
d.addRear('dog')
d.addFront(True)
d.addFront(8.4)
d.size()
4
d.isEmpty()
False
d.removeFront()
8.4
d.size()
3