zoukankan      html  css  js  c++  java
  • 数据结构 Python实现

    参考博客:浅谈算法和数据结构: 一 栈和队列   Python数据结构——栈、队列的实现(一)    Python数据结构——栈、队列的实现(二)    Python数据结构——链表的实现

    数据结构

      定义:简单来说,数据结构就是设计数据以何种方式组织并存储在计算机中。比如:列表、集合与字典等都是一种数据结构。

      PS:“程序=数据结构+算法”

      列表:在其他编程语言中称为“数组”,是一种基本的数据结构类型。
        关于:列表的存储问题!

    栈:
      栈(Stack)是一个数据集合,可以理解为只能在一端进行插入或删除操作的列表。
      栈的特点:后进先出(last-in, first-out)
      栈的概念:
        栈顶
        栈底
      栈的基本操作:
        进栈(压栈):push

        出栈:pop
        取栈顶:gettop

     

    利用python简单实现栈操作

    class Stack(object):
        def __init__(self):
            self.stack=[]
        def isEmpty(self):
            return self.stack==[]
        def push(self,item):
            self.stack.append(item)
        def pop(self):
            if self.isEmpty():
                raise IndexError,'pop from empty stack'
            return self.stack.pop()
        def peek(self):
            return self.stack[-1]
        def size(self):
            return len(self.stack)

    栈的应用——括号匹配问题
    括号匹配问题:给一个字符串,其中包含小括号、中括号、大括号,求该字符串中的括号是否匹配。
    例如:
      ()()[]{} 匹配
      ([{()}]) 匹配
      []( 不匹配
      [(]) 不匹配

    def kuohaopipei(exp="{[()]}"):
        stack = []
        for i in exp:
            if i in {'(','[','{'}:
                stack.append(i)
            if i == ')':
                if len(stack)>0 and stack[-1] == '(':
                    stack.pop()
                else:
                    return False
            if i == ']':
                if len(stack)>0 and stack[-1] == '[':
                    stack.pop()
                else:
                    return False
            if i == '}':
                if len(stack)>0 and stack[-1] == '{':
                    stack.pop()
                else:
                    return False
        if len(stack)==0:
            return True
        else:
            return False
    
    
    print(kuohaopipei("{()()[(([]{}))]}"))
    

    队列
      队列(Queue)是一个数据集合,仅允许在列表的一端进行插入,另一端进行删除。
        进行插入的一端称为队尾(rear),插入动作称为进队或入队
        进行删除的一端称为队头(front),删除动作称为出队
      队列的性质:先进先出(First-in, First-out)

      双向队列:队列的两端都允许进行进队和出队操作。

     

    队列实现:
      使用方法:from collections import deque
      创建队列:queue = deque(li)
      进队:append
      出队:popleft
      双向队列队首进队:appendleft
      双向队列队尾进队:pop

    队列的实现原理
      普通队列:
        初步设想:列表+两个下标指针
        创建一个列表和两个变量,front变量指向队首,rear变量指向队尾。初始时,front和rear都为0。
        进队操作:元素写到li[rear]的位置,rear自增1。
        出队操作:返回li[front]的元素,front自减1。

      环形队列:
        改进方案:将列表首尾逻辑上连接起来。
        环形队列:当队尾指针front == Maxsize + 1时,再前进一个位置就自动到0。
        实现方式:求余数运算
        队首指针前进1:front = (front + 1) % MaxSize
        队尾指针前进1:rear = (rear + 1) % MaxSize
        队空条件:rear == front
        队满条件:(rear + 1) % MaxSize == front

     

  • 相关阅读:
    团队冲刺二(6)
    团队冲刺二(5)
    JAVA面试中问及HIBERNATE与 MYBATIS的对比,在这里做一下总结
    解决ADB server didn't ACK问题,连上手机问题
    ADB server didn't ACK
    android错误
    Andy
    在Eclipse下搭建Android开发环境教程
    VM VirtualBox 安装 Android 4.3虚拟机完整教程
    电脑安装Android4.0虚拟机的做法
  • 原文地址:https://www.cnblogs.com/zh605929205/p/7486584.html
Copyright © 2011-2022 走看看