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

原文地址:https://www.cnblogs.com/wang-kai-1994/p/10222213.html

时间: 2024-11-06 03:30:39

Python模拟 堆栈,队列,链表的相关文章

c语言基础----堆栈队列链表

堆 堆则是一种经过排序的树形数据结构,常用来实现优先队列,他的特点在于形成某种优先的结构.在计算机经常用到,比如优先队列,或者是优先进程管理. 堆(也叫二叉堆)的性质: 1.任何一个节点,都不大于他的父亲节点. 2.必须是一颗完全二叉树 栈 在数据结构中,栈是一种可以实现“先进后出”(或者称为“后进先出”)的存储结构.假设给定栈 S=(a0,a1,…,an-1),则称 a0 为栈底,an-1 为栈顶.进栈则按照 a0,a1,…,an-1 的顺序进行进栈:而出栈的顺序则需要反过来,按照“后存放的先

算法(第四版)学习笔记之java实现栈和队列(链表实现)

下压堆栈(链表实现): import java.util.Iterator; public class LinkedStack<Item> implements Iterable<Item> { public class Node { Item item; Node next; } private Node frist; private int N = 0; public boolean isEmpty() { return N == 0; } public int size()

数据结构和算法之栈和队列一:两个栈模拟一个队列以及两个队列模拟一个栈

今天我们需要学习的是关于数据结构里面经常看到的两种结构,栈和队列.可以说我们是一直都在使用栈,比如说在前面递归所使用的的系统的栈,以及在链表倒序输出时介绍的自定义栈类Stack和使用系统的栈进行递归.那么,在这里我们就讲述一下这两个比较具有特色的或者说关系比较紧密的数据结构之间的互相实现问题. 一:两个栈模拟实现一个队列: 栈的特点是先进后出,然而队列的特点是先进先出. public class Queen(Stack s1,Stack s2){ //实现插入的方法 public void ad

队列篇之使用数组模拟一个队列

队列是一个有序列表, 可以使用数组实现, 也可以使用链表实现 队列遵守先进先出的原则 1. 下面使用数组模拟一个队列 public class ArrayQueueDemo { public static void main(String[] args) { ArrayQueue queue = new ArrayQueue(3); queue.add(1); queue.show(); System.out.println("-----------------"); queue.ad

Python模拟数据工具哪些比较好用

今天给大家推荐两款基本的Python模拟数据工具:mock和pytest monkeypatch. 为什么要模拟数据? 我们的应用中有一些部分需要依赖外部的库或对象.为了隔离开这部分,我们需要代替这些外部依赖,因而就用到了模拟数据.我们模拟外部的API来产生特定的行为,比如说返回符合之前定义的恰当的返回值. 模拟函数 我们有一个function.py的模块: 然后我们来看下如何将其与Mock库结合使用的: 这里发生了什么?1-4行是为了兼容python 2和3来引入的代码,在python 3中m

python模拟腾讯网页登录

近日,研究Tencent网页模拟登录的过程,过程有些忐忑.先将结果写于此,供大家参考: 其加密过程在c_login_old.js文件中执行,将JS关键代码提取出来如下: function hexchar2bin(str) { var arr = []; for (var i = 0; i < str.length; i = i + 2) { arr.push("\\x" + str.substr(i, 2)) } arr = arr.join(""); eva

hdu 1175 连连看(模拟循环队列)

连连看 Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 18149    Accepted Submission(s): 4741 Problem Description "连连看"相信很多人都玩过.没玩过也没关系,下面我给大家介绍一下游戏规则:在一个棋盘中,放了很多的棋子.如果某两个相同的棋子,可以通过一条线连起来(这条

python模拟鼠标键盘操作 GhostMouse tinytask 调用外部脚本或程序 autopy右键另存为

1.参考 autopy (实践见最后一章节) 用Python制作游戏外挂(上) AutoPy Introduction and Tutorial autopy.mouse.smooth_move(1, 1) 可以实现平滑移动 autopy - API Reference pip install PyUserInput SavinaRoja/PyUserInput [python3.5][PyUserInput]模拟鼠标和键盘模拟 Python-模拟鼠标键盘动作 autoit selenium借助

算法学习(二) 全排列问题的非递归算法——模拟堆栈

前一段时间总结了全排列问题的几种递归解法,今天再总结一下如何通过对系统栈行为的模拟来非递归的实现全排列问题. 我们用一个数组stack[]来表示一个栈,用一个top指针来表示栈顶,用一个flags[]数组来标示每一个数字的可用性:用i来表示当前的状态. 初始状态top=0:i=-1:flags数组全为1: i递增,如果i没有越界并且flags[i]==1,那么就将i写入栈中,栈顶往前移动一位:最后把flags[i]赋值为0,i回溯到初始状态-1: 当栈顶越界,就将整个栈的信息打印出来,然后top