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("\n")

if __name__=="__main__":
    q=Queue()
    q.enqueue(1)
    q.enqueue(2)
    q.enqueue(3)

    q.travel()

 

posted @ 2020-11-04 20:41  最近饭吃的很多  阅读(91)  评论(0编辑  收藏  举报