栈与队列

栈和队列

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),并且只允许在队尾进,队头出。

img

**队头(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
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值