数据结构与算法之 数据结构:列表、栈、队列、链表

数据结构:数据元素的集合 + 数据元素之间的关系

列表

1、特点:
    顺序存储
    插入和删除 O(n)
2、与数组的区别:
    数组的元素类型相同,数组长度固定

1、特点:
    一个数据集合,后进先出
    使用一般的列表结构可以实现栈

2、应用:
括号匹配问题
    思路:左括号进栈,右括号则判断栈顶匹配时出栈

class Stack:
    def __init__(self):
        self.stack = []
        
    def push(self,element):
        self.stackappenf(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 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 Ture     
     else:
        return False
    
print(brace_match('[{}][]{()}')

队列

1、特点:
    一个数据集合,先进先出
    使用一般的列表结构可以实现队列
    
2、环形队列:当front = MaxSize-1时,再前进一个位置就自动到0
    队空:rear == front
    队满:(rear + 1) % MaxSize == front
    队首指针前进1:front = (front+1) % MaxSize
    队尾指针前进1:rear = (rear+1) % MaxSize
    
3、python队列内置模块:当队满时,会自动出队
    from collection import deque
    
    q = deque()    
    q.append(1)    队尾进队
    q.appendleft(1) 队首进队 
    q.pop() 队尾出队
    q.popleft() 队首出队

 

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("Queue is filled!!")
            
     def pop(self):
        if not self.is_empty():
        	self.front = (self.front + 1) % self.Size
     		return self.queue[self.front]
        else:
            raise IndexError("Queue 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)
  q.pop()      

链表

1、特点:
    内存分配更灵活
    在插入删除操作上明显快于顺序表
    对树和图的结果有很大的启发性

2、复杂度分析:
    按下标查找:O(1)
    按元素值查找:O(n)
    在某元素后插入: O(n)
    删除某元素: O(n)

class Node:
    """链表结点"""
	def __init__(self, item):
        self.item = item
        self.next = None
       
    
def creat_linklist_head(li):
    """头插法"""
     head = Node(li[0])
		for element in li[1:]:
             node = Node(element)
             node.next = head
             head = node
         return head
    
def creat_linklist_tail(li):
    """尾插法"""
     head = Node(li[0])
     tail = head
		for element in li[1:]:
             node = Node(element)
             tail.next = head
             tail = node
         return head
    
def print_linklist(lk):
    """打印列表"""
    while lk:
        print(lk.item, end=',')
        lk = lk.next
        
        
lk = create_linklist_head([1,2,5,7])
print_linklist(lk)
        

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

水w

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值