zoukankan      html  css  js  c++  java
  • B.数据结构(栈和队列)

    一、栈

    A、顺序存储结构

    # 自定义异常
    class StackUnderflow(ValueError): # 栈下溢(空栈访问)
        pass
    
    
    # 列表头作为栈底,列表尾作为栈顶
    # 缺点:1、扩大存储需要做一次高代价的操作 2、需要完整的大块存储区域
    
    # 使用list作为栈来使用
    # lst = []
    # lst.append()  # 压入
    # lst[-1]  # 访问栈顶
    # lst.pop()     # 弹出
    class SStack:
        def __init__(self):
            self._elems = []
    
        def is_empty(self):
            '''判断栈是否为空'''
            return self._elems == []
            # return  not self._elems
    
        def peek(self):
            '''返回栈顶元素'''
            if self._elems == []:
                raise StackUnderflow("空栈异常:in SStack.top()")
            return self._elems[-1]
    
        def push(self,elem):
            '''追加一个新的元素elem到栈顶'''
            self._elems.append(elem)
            # 从尾部添加时间复杂度为O(1)
            # self._elems.insert(0,elem)
            # 如果从列表第一个位置开始添加,时间复杂度是O(n),链表正相反
    
        def pop(self):
            '''弹出栈顶元素'''
            if self._elems == []:
                raise StackUnderflow("空栈异常:in SStack.pop()")
            return self._elems.pop()
    
    if __name__ == "__main__":
    
        st1 = SStack()
        st1.push(3)
        st1.push(7)
        st1.push(5)
        while not st1.is_empty():
            print(st1.pop()) # 5 7 3

    B、链式存储结构

    # 表头作为栈顶,表尾作为栈底
    # 优点:解决了顺序表的缺点-->新增节点开销小,不需要连续锋内存
    # 缺点:1、依赖解释器的存储管理   2、每个节点开销
    
    class Node(object):
        def __init__(self,val):  # 定位的点的值和一个指向
            self.val=val    # 指向元素的值,原队列第二元素
            self.next=None
    
    class stack(object):
    
        def __init__(self):
            self.__head=None  # 初始化最开始的位置
    
        def is_empty(self):
            '''判断栈是否为空'''
            return self.__head is None
    
        def peek(self):
            '''返回栈顶元素'''
            if self.__head!=None:  # 如果栈顶不为空
                return self.__head.val  # 返回栈顶元素的值
            else:
                return None
    
        def push(self,n):
            '''追加一个新的元素elem到栈顶'''
            node = Node(n)  # 实例化节点
            node.next = self.__head
            self.__head = node
            return node.val
    
        def pop(self):
            '''弹出栈顶元素'''
            if self.__head == None:
                return None
            else:
                tmp = self.__head.val
                self.__head = self.__head.next  #下移一位,进行
                return tmp
    
    
    if __name__=="__main__":
        s=stack()
        s.push(1)
        s.push(2)
        s.push(3)
    
        print (s.pop())  # 3
        print (s.pop())  # 2
        print (s.pop())  # 1

    二、队列

    A.顺序存储结构实现

    1.单端队列

    # 入队操作频繁选择 列表尾部添加元素O(1) 列表头部弹出元素
    # 出队操作频繁选择 列表尾部弹出元素O(1) 列表头部添加元素
    
    class Queue(object):
    
        def __init__(self):
            self.__list = []
    
        def is_empty(self):
            '''判断一个队列是否为空'''
            return self.__list == []
    
        def enqueue(self, item):
            '''进入队列'''
            self.__list.append(item)
    
        def dequeue(self):
            '''退出队列'''
            return self.__list.pop(0)
    
        def size(self):
            return len(self.__list)
    
    
    
    if __name__=="__main__":
        q = Queue()
        q.enqueue(1)
        q.enqueue(2)
        q.enqueue(3)
    
        print(q.dequeue())
        print(q.dequeue())
        print(q.dequeue())

    2.双端队列

    class Deque(object):
    
        def __init__(self):
            self.__list = []
    
        def is_empty(self):
            '''判断一个队列是否为空'''
            return self.__list == []
    
        def add_front(self, item):
            '''队列头部添加元素'''
            self.__list.insert(0, item)
    
        def add_rear(self, item):
            '''队列尾部添加元素'''
            self.__list.append(item)
    
        def pop_front(self):
            '''从队列头部删除一个元素'''
            return self.__list.pop(0)
    
        def pop_rear(self):
            '''从队列尾部删除一个元素'''
            return self.__list.pop()
    
        def size(self):
            return len(self.__list)
    
    
    
    if __name__=="__main__":
        q = Deque()
        q.add_front(1)
        q.add_rear(2)
        q.add_rear(3)
    
        print(q.pop_front())
        print(q.pop_rear())

    B.链式存储结构实现

    class Node(object):
        def __init__(self,val):
            self.next = None  #指针的下一个,用于指向内容,先给初始化设置为空
            self.val = val   #val是它原本的值,
    
    class Queue(object):
    
        def __init__(self, node=None):
            '''空队列,记录队头位置'''
            self.__head = node
    
        def is_empty(self):
            '''判断队列是否为空'''
            return self.__head == None
    
        def enqueue(self, item):
            '''入队列,链表尾部添加节点'''
            node = Node(item)
            if self.is_empty():
                self.__head = node
            else:
                cur = self.__head
                while cur.next:
                    cur = cur.next
                cur.next = node
    
        def dequeue(self):
            '''出队列,删除头结点'''
            if self.is_empty():
                return None
            else:
                cur = self.__head
                self.__head = cur.next
    
    
        def travel(self):
            '''遍历队列'''
            if self.is_empty():
               return
            else:
               cur = self.__head
               while cur:
                   print(cur.val,end=" ")
                   cur = cur.next
               print("
    ")
    
    if __name__=="__main__":
        q=Queue()
        q.enqueue(1)
        q.enqueue(2)
        q.enqueue(3)
    
        q.travel()
  • 相关阅读:
    静态查找表和动态查找表
    内存分配
    常用不等式
    考研线性代数(向量,线性方程组)
    考研线性代数(矩阵)
    考研线性代数(行列式)
    微积分常用思想方法小结
    bug修复集合(不定期更新)
    上下文对象及servletContext接口
    手动编解码解决get提交错误的问题
  • 原文地址:https://www.cnblogs.com/zhaojiayu/p/13928464.html
Copyright © 2011-2022 走看看