列表 栈 队列及其python代码实现

列表

存储方式

顺序存储

C数组与python列表的区别

1.数组元素类型相同
2.数组长度固定

C数组

在这里插入图片描述
32位机器上,一个整数占4字节
64位机器上,一个整数占8字节
因此数组里存的都是值

python列表

在这里插入图片描述
列表里存的是地址,再指向值

相关操作的时间复杂度

查找:index O(1)
增加:append O(1)
插入:insert O(n)
删除:pop remove O(n)

定义

可以理解为只能在一端进行插入或删除操作的列表

特点

先进后出,可以想象成电梯(先进来的在最里面,也是最后走的)

相关操作

进栈:push
出栈:pop
取栈顶:gettop(看值不取 出来)
在这里插入图片描述

代码实现

class Stack():

    def __init__(self):
        self.stack = []

    def push(self,element):
        self.stack.append(element)

    def pop(self):
        return self.stack.pop()

    def get_top(self):
        if len(self.stack) > 0:
            return self.stack[-1]
        else:
            return None

    def is_empty(self):
        return len(self.stack) == 0

在这里插入图片描述

栈的应用:括号匹配问题

思路

每次读入一个字符,若是( { [ 则push,若是 } ] ),则与栈底相比较,相匹配则输出

代码实现

from stack import Stack

def brace_match(s):
    match = {'}':'{',']':'[',')':'('}
    stack = Stack()
    for ch in s:
        if ch in {'(','{','['}:
            stack.push(ch)
        else:  #是 } ] )
            if stack.is_empty():
                return False
            elif stack.get_top() == match[ch]:
                stack.pop()
            else:
                return False
    if stack.is_empty():
        return True
    else:
        return False

print(brace_match('[{}[()]])'))
print(brace_match('[]{()}'))

在这里插入图片描述

队列

定义

仅允许在列表的一端进行插入,另一端进行删除

相关操作

在这里插入图片描述
进行插入的一段成为队尾(rear),插入动作成为进队 入队
进行删除的一段成为队头(front),删除动作成为出队

性质

先进先出

队列的实现方式–环形队列

在这里插入图片描述
空队列:rearfront
队满:rear + 1
front % Mazsize
关键的问题:当队尾指针front = Mazsize + 1时,自动进到下一个位置0
队首/队尾指针+1 front/rear = front/rear + 1

代码实现

class Queue:
    def __init__(self,size=100):
        self.queue = [0 for _ in range(size)]
        self.size = size
        self.rear = 0   #队尾指针
        self.front = 0   #队首指针

    def push(self,element):
        if not self.is_filled():
            self.rear = (self.rear + 1) % self.size
            self.queue[self.rear] = element
        else:
            raise IndexError('Queen if filled!')

    def pop(self):
        if not self.is_empty():
            self.front = (self.front + 1) % self.size
            return self.queue[self.front]
        else:
            raise IndexError('Queen is empty!')

    def is_empty(self):
        return self.rear == self.front

    def is_filled(self):
        return (self.rear + 1) % self.size == self.front

q = Queue(5)
for i in range(4):
    q.push(i)
print(q.is_filled())
print(q.pop())

在这里插入图片描述

双向队列

两边均可进行出队和进队
在这里插入图片描述

python内置模块

参数说明

q = deque([元素],队长度)
注意如果队满后,会自动让队首出队

from collections import deque

q = deque()
q.append(1)  #队尾进队
print(q.popleft())  #队首出队

#用于双向队列
q.appendleft(1)  #队首进队
print(q.pop())  #队尾出队

#相关参数
q = deque([1,2,3,4,5],5)
q.append(6)
print(q.popleft())

在这里插入图片描述

linux_tail命令

问题

打印文件后五行:
wefjio
rfqerfdsnajkc
dfamfnkoa
1432
fgqefgji
fwjia
3245
gegf
5

代码实现
from collections import deque

def tail(n):
    with open('linux-tail.txt','r') as f:
        q = deque(f,n)
        return  q

for line in tail(5):
    print(line,end='')

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值