首页 > 编程语言 >python数据结构学习第一章——栈

python数据结构学习第一章——栈

时间:2024-10-12 22:21:56浏览次数:1  
标签:__ None return python self 第一章 数据结构 data top

在这片文章中,我们使用python3.8自制一个具有基本功能的栈结构,它的功能只有push,pop,peek这三个功能

` #!/usr/bin/env python
# * coding: utf-8 *
# @Time : 2024/9/15 19:26
# @Author : Huzhaojun
# @Version:V 1.0
# @File : test.py
# @desc :

# 数据结构复习第一章, 栈结构的实现与运用

class Node:
    """创建节点"""

    def __init__(self, data=None):
        self.data = data
        self.next = None


class stack:

    def __init__(self):
        self._n = 0                 # 记录元素个数
        self.top = None             # 这是一个永远指向栈顶的指针
        self.next = None            # 指向下一个元素

    def push(self, data):           # push 压入函数
        node = Node(data)           # 新建一个节点,并将其添加入栈中
        if self.top:                # 如果栈内有元素,就更新top指针的指向内容
            node.next = self.top
            self.top = node
        else:                       # 否则直接指向新节点
            self.top = node

        self._n += 1

    def pop(self):                  # pop 弹出函数
        if self.top:                # 判断栈顶是否存在元素,如果存在则执行下一步操作,否则直接返回None
            data = self.top.data    # 获取栈顶的值
            self._n -= 1

            if self.top.next:       # 如果栈顶之下还存在其他元素,则替换指向指针的值
                self.top = self.top.next

            else:                   # 否则直接定义为None
                self.top = None

            return data

        return None

    def peek(self):                 # 查看栈顶值
        if self.top:
            return self.top.data

        return None

`
使用过程:
x = stack()
x.push(1)
x.push(2)
print(x.peek())
print(x.pop())
print(x.peek())

输出结果:
2
2
1

实战一下
bracket-matching应用程序是一个常用的匹配括号的验证程序,验证包括(),{},【】符号是否平衡,及左右括号数量是否匹配,它还将确保一对括号确实包含在另一对括号中。
我们试着来验证一段xml文件,看看结果如何,注意,我在stack中新添了一个__len__函数:

`
#!/usr/bin/env python
# * coding: utf-8 *
# @Time : 2024/9/15 19:26
# @Author : Huzhaojun
# @Version:V 1.0
# @File : test.py
# @desc :

# 数据结构复习第一章, 栈结构的实现与运用

class Node:
    """创建节点"""

    def __init__(self, data=None):
        self.data = data
        self.next = None


class stack:

    def __init__(self):
        self._n = 0                 # 记录元素个数
        self.top = None             # 这是一个永远指向栈顶的指针
        self.next = None            # 指向下一个元素

    def __len__(self):              # 定义 len 事件
        return self._n

    def push(self, data):           # push 压入函数
        node = Node(data)           # 新建一个节点,并将其添加入栈中
        if self.top:                # 如果栈内有元素,就更新top指针的指向内容
            node.next = self.top
            self.top = node
        else:                       # 否则直接指向新节点
            self.top = node

        self._n += 1

    def pop(self):                  # pop 弹出函数
        if self.top:                # 判断栈顶是否存在元素,如果存在则执行下一步操作,否则直接返回None
            data = self.top.data    # 获取栈顶的值
            self._n -= 1

            if self.top.next:       # 如果栈顶之下还存在其他元素,则替换指向指针的值
                self.top = self.top.next

            else:                   # 否则直接定义为None
                self.top = None

            return data

        return None

    def peek(self):                 # 查看栈顶值
        if self.top:
            return self.top.data

        return None


def check_brackets(statement):
    Stack = stack()
    for ch in statement:
        if ch in "({[<":
            Stack.push(ch)

        if ch in ")}]>":
            last = Stack.peek()
            if last + ch in ("()", "[]", "{}", "<>"):
                Stack.pop()
            else:
                return False

    if len(Stack) > 0:
        return False

    return True

text = """
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>MainWindos</class>
 <widget class="QDialog" name="MainWindos">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>402</width>
    <height>575</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>music</string>
  </property>
 </widget>
 <resources/>
 <connections/>
</ui>"""

print(check_brackets(text))

`

运行结果:
True

自建的数据结构可以因需求而添加任意想要实现的方法,虽然内置的方法已经可以解决绝大部分问题了,但是在这过程中我们可以学习到更多。OVER

标签:__,None,return,python,self,第一章,数据结构,data,top
From: https://www.cnblogs.com/I-LOVE-YOU-hzj/p/18461597

相关文章

  • 数据结构与算法Python版p26-p28 无序表链表实现、有序表
    B站视频-数据结构与算法Python版无序表链表实现、有序表一、节点二、无序表三、有序表一、节点#节点classNode:def__init__(self,initdata):self.data=initdataself.next=NonedefgetData(self):returnself.data......
  • 以Python方式理解Mixin
    通过Python理解Mixin概念-腾讯云开发者社区-腾讯云(tencent.com)Mixin的概念Mixin即Mix-in,常被译为“混入”,是一种编程模式,在Python等面向对象语言中,通常它是实现了某种功能单元的类,用于被其他子类继承,将功能组合到子类中。利用Python的多重继承,子类可以继承不同功......
  • 第108天:免杀对抗-Python&混淆算法&反序列化&打包生成器&Py2exe&Nuitka
    知识点#知识点:1、Python-对执行代码做文章2、Python-对shellcode做文章3、Python-对代码打包器做文章#章节点:编译代码面-ShellCode-混淆编译代码面-编辑执行器-编写编译代码面-分离加载器-编写程序文件面-特征码定位-修改程序文件面-加壳花指令-资源代码加载面-Dll反......
  • 机器学习主成分分析算法 PCA—python详细代码解析(sklearn)
    一、问题背景在进行数据分析时,我们常常会遇到这样的情况:各个特征变量之间存在较多的信息重叠,也就是相关性比较强。就好比在研究一个班级学生的学习情况时,可能会收集到学生的语文成绩、数学成绩、英语成绩等多个特征变量。但往往会发现,语文成绩好的学生,数学和英语成绩也可能比......
  • Python字符串格式
    文章目录1.数字与ASCII码转换2.字符串输出格式(%)2.1数字进制与小数表示2.2字符串长度与对齐方式3.字符串输出格式(f'')4.字符串输出格式(format)5.转义字符(换行、Tab)6.字符串查找统计替换等1.数字与ASCII码转换将ASCII码转化为数字或者将数字转化为ASCII码时,......
  • 【零基础学Python】项目实战:使用Django框架搭建私人博客第(二)天 —— 注册、登录功能实
    一、前言通过上次的学习我们已经顺利的搭建了一个私人博客框架,接下来我们开始写页面。本章节代码打包上传,资源下载链接:注意:本系列文章旨在使小白在尽可能短的时间内利用Django搭建一个较为完整的项目,因此页面功能将会非常简单,美工==几乎没有,见谅。二、创建应用1.创建accou......
  • 21年计算机挑战赛Python组区域赛题目及个人解答(重置版)
    1.乌鸦喝水代码部分#计算机挑战赛--乌鸦喝水x=int(input('请输入底边的边长:\n'))y=int(input('请输入容器内水面距离瓶子口的距离:\n'))z=0while1:ifx*x*y-8*z<2*x*x:print(f'需要投放{z}个石子乌鸦才能喝到水')breakelse:......
  • Python 潮流周刊#72:Python 3.13.0 最终版已发布!(摘要)
    本周刊由Python猫出品,精心筛选国内外的250+信息源,为你挑选最值得分享的文章、教程、开源项目、软件工具、播客和视频、热门话题等内容。愿景:帮助所有读者精进Python技术,并增长职业和副业的收入。分享了14篇文章,12个开源项目,4则音视频,全文2300字。以下是本期摘要:......
  • 八、Python基础语法(判断语句-下)
    一、ifelifelse结构应用场景:多个判断条件下,并且这些判断条件存在一定的关联。语法:elif也是python中关键字,后面跟一个判断条件,判断条件后面跟冒号存在冒号,需要换行缩进,处于elif缩进中的代码,是eilf代码块。if和多个elif之间,只要有一个条件成立,后续条件不再执行。需......
  • 【python 简易入门应用教程】第一部分:Python 基础
    第一部分:Python基础1.Python简介Python是一种高层次的、解释型的编程语言,由GuidovanRossum于1980年代末发明,并于1991年首次发布。它设计之初的目标是提高代码的可读性和简洁性,采用类似于英语的语法结构。Python的历史与特点历史Python的创始人Guidovan......