Python模拟 堆栈,队列,链表

Posted wang-kai-1994

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python模拟 堆栈,队列,链表相关的知识,希望对你有一定的参考价值。

1. 堆栈

class my_stack(object):
    def __init__(self, value):
        self.value = value
        # 前驱
        self.before = None
        # 后继
        self.behind = None

    def __str__(self):
        return str(self.value)


def top(stack):
    if isinstance(stack, my_stack):   # 判断对象是否合法
        if stack.behind is not None:  # 如果behind属性不为空
            return top(stack.behind)     # 模拟对象的连接,直至找到为空的对象,并返回
        else:
            return stack                # 如果behind 为空,返回其


def push(stack, ele):  # 进栈
    push_ele = my_stack(ele)      # 实例对象 push_ele
    if isinstance(stack, my_stack):     
        stack_top = top(stack)        # 得到一个behind为空的对象
        push_ele.before = stack_top        # push_ele 的前驱 before 连接 stack对象
        push_ele.before.behind = push_ele  # stack对象的后继 behind 连接 push_ele
    else:
        raise Exception(不要乱扔东西进来好么)    # 非法对象


def pop(stack):  # 出栈
    if isinstance(stack, my_stack):     # 判断对象是否合法
        stack_top = top(stack)          # 得到一个behind为空的对象
        if stack_top.before is not None:    # 如果其前驱不为空,代表连接了对象
            stack_top.before.behind = None  # 前驱连接的后继设为空
            stack_top.behind = None            # 后继设为空
            return stack_top
        else:
            print(已经是栈顶了)            # 前驱为None,代表空栈

 

2. 队列

class MyQueue():
    def __init__(self, value=None):
        self.value = value
        # 前驱
        self.before = None
        # 后继
        self.behind = None

    def __str__(self):
        if self.value is not None:
            return str(self.value)
        else:
            return None

def create_queue():
    """仅有队头"""
    return MyQueue()        # 实例

def last(queue):
    if isinstance(queue, MyQueue):
        if queue.behind is not None:        # 返回一个后继为空的对象,不为空继续找
            return last(queue.behind)
        else:
            return queue

def push(queue, ele):    # 入列
    if isinstance(queue, MyQueue):
        last_queue = last(queue)
        new_queue = MyQueue(ele)
        last_queue.behind = new_queue        # new_queue连接last(queue)的后继

def pop(queue):            # 出列
    if queue.behind is not None:                
        get_queue = queue.behind
        queue.behind = queue.behind.behind        # queue.behind不为空时连接下一个对象的后继
        return get_queue
    else:
        print(队列里已经没有元素了)

def print_queue(queue):
    print(queue)
    if queue.behind is not None:
        print_queue(queue.behind)

 

3. 双端队列

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)    
    

 

4. 优先级队列

import queue as Q

class Skill(object):
    def __init__(self, priority, description):
        self.priority = priority
        self.description = description

    def __lt__(self, other):
        return self.priority < other.priority

    def __str__(self):
        return ( + str(self.priority) + ,‘ + self.description + ‘)


def PriorityQueue_class():
    que = Q.PriorityQueue()        # 优先级队列
    que.put(Skill(7, proficient7))    # 第一个参数作为判断
    que.put(Skill(5, proficient5))
    que.put(Skill(6, proficient6))
    que.put(Skill(10, expert))
    que.put(Skill(1, novice))
    print(end)
    while not que.empty():
        print(que.get())


PriorityQueue_class()

 

5. 单向链表

class Node(object):
    def __init__(self, value):
        # 元素域
        self.value = value    # 变量
        # 链接域
        self.next = None    # 指针


class LinkedListOneway(object):            # 单向链表
    def __init__(self, node=None):
        self.__head = node

    def __len__(self):
        # 游标,用来遍历链表
        cur = self.__head
        # 记录遍历次数
        count = 0
        # 当前节点为None则说明已经遍历完毕
        while cur:
            count += 1
            cur = cur.next        # cur.next 指向None ,遍历完成,循环结束
        return count    

    def is_empty(self):
        # 头节点不为None则不为空
        return self.__head == None

    def add(self, value):
        """
        头插法
        先让新节点的next指向头节点
        再将头节点替换为新节点
        顺序不可错,要先保证原链表的链不断,否则头节点后面的链会丢失
        """
        node = Node(value)
        node.next = self.__head
        self.__head = node

    def append(self, value):
        """尾插法"""
        node = Node(value)
        cur = self.__head
        if self.is_empty():
            self.__head = node
        else:
            while cur.next:
                cur = cur.next
            cur.next = node

    def insert(self, pos, value):
        # 应对特殊情况
        if pos <= 0:
            self.add(value)
        elif pos > len(self) - 1:
            self.append(value)
        else:
            node = Node(value)
            prior = self.__head
            count = 0
            # 在插入位置的前一个节点停下
            while count < (pos - 1):
                prior = prior.next
                count += 1
            # 先将插入节点与节点后的节点连接,防止链表断掉,先链接后面的,再链接前面的
            node.next = prior.next
            prior.next = node

    def remove(self, value):
        cur = self.__head
        prior = None
        while cur:
            if value == cur.value:
                # 判断此节点是否是头节点
                if cur == self.__head:
                    self.__head = cur.next
                else:
                    prior.next = cur.next
                break
            # 还没找到节点,有继续遍历
            else:
                prior = cur
                cur = cur.next

    def search(self, value):
        cur = self.__head
        while cur:
            if value == cur.value:
                return True
            cur = cur.next
        return False

    def traverse(self):
        cur = self.__head
        while cur:
            print(cur.value)
            cur = cur.next

 

6. 双向链表

class LinkedList():
    def __init__(self, value=None):
        self.value = value
        # 前驱
        self.before = None
        # 后继
        self.behind = None

    def __str__(self):
        if self.value is not None:
            return str(self.value)
        else:
            return None

def init():
    return LinkedList(HEAD)

def delete(linked_list):
    if isinstance(linked_list, LinkedList):
        if linked_list.behind is not None:
            delete(linked_list.behind)
            linked_list.behind = None
            linked_list.before = None
        linked_list.value = None

def insert(linked_list, index, node):
    node = LinkedList(node)
    if isinstance(linked_list, LinkedList):
        i = 0
        while linked_list.behind is not None:
            if i == index:
                break
            i += 1
            linked_list = linked_list.behind
        if linked_list.behind is not None:
            node.behind = linked_list.behind
            linked_list.behind.before = node
        node.before, linked_list.behind = linked_list, node

def remove(linked_list, index):
    if isinstance(linked_list, LinkedList):
        i = 0
        while linked_list.behind is not None:
            if i == index:
                break
            i += 1
            linked_list = linked_list.behind
        if linked_list.behind is not None:
            linked_list.behind.before = linked_list.before
        if linked_list.before is not None:
            linked_list.before.behind = linked_list.behind
        linked_list.behind = None
        linked_list.before = None
        linked_list.value = None

def trave(linked_list):
    if isinstance(linked_list, LinkedList):
        print(linked_list)
        if linked_list.behind is not None:
            trave(linked_list.behind)

def find(linked_list, index):
    if isinstance(linked_list, LinkedList):
        i = 0
        while linked_list.behind is not None:
            if i == index:
                return linked_list
            i += 1
            linked_list = linked_list.behind
        else:
            if i < index:
                raise Exception(404)
            return linked_list

 

以上是关于Python模拟 堆栈,队列,链表的主要内容,如果未能解决你的问题,请参考以下文章

python模拟队列和堆栈(列表练习)

python列表模拟堆栈和队列

PTA-7-22 堆栈模拟队列

数组链表堆栈和队列

java:堆栈,队列,枚举,链表

SPL 数据结构1-双向链表,堆栈,队列