暑假学习数据结构及简单算法(第三天)

本文介绍了Python中栈、队列和链表的基础知识及应用。栈通过适配器模式用列表实现,用于数据逆置和括号匹配;队列的操作包括enqueue和dequeue,适合解决先进先出问题;链表则涉及节点和指针的概念。文章还探讨了HTML标记匹配的栈应用。
摘要由CSDN通过智能技术生成

昨天由于个人原因复习计划有些被打断,今天按计划开始学习 栈,队列和双端队列,链表。

一.栈

1.栈的操作

push(),pop(),top(),is_empty(),len()

2.简单的基于数组的栈实现

可以用list代替栈,但是有一些小区别(比如:列表可以增加或移除处于列表任意位置的元素),且append方法和push方法之间也有区别。我们应该如何改进?

适配器模式。
1.适配器设计模式可以有效修改一个现有的类。
2.方法:包含一个现有类的实例作为隐藏域,用隐藏实例变量的方法实现这个新类的方法的方式定义一个新类。

用python的列表实现一个栈:
(用适配器设置模式定义一个arraystack类,使用列表存储。同时,定义一个异常类处理栈空还取的情况)

class Empty(Exception):
    pass

class arraystack:
    def __init__(self):
        self._data = []

    def __len__(self):
        return len(self._data)

    def is_empty(self):
        return len(self._data) == 0

    def push(self, e):
        self._data.append(e)

    def top(self):
        if self.is_empty():
            raise Empty('stack is empty')
        return self._data[-1]

    def pop(self):
        if self.is_empty():
            raise Empty('stack is empty')
        return self._data.pop()

代码中部分面向对象知识的解释1

3.栈的简单应用

1)栈实现数据的逆置

目标:实现文件中各行的逆置(即将第一行移到最后一行)
原理:栈先进后出
步骤:按照循序入栈,再逐个出栈
代码展示:

def reverse_file(filename):
    s = Arraystack()
    f = open(filename, 'r', encoding='utf-8')
    for line in f:
        s.push(line.rstrip('\n'))
    f.close()

    out = open(filename, 'w', encoding='utf-8')
    while not s.is_empty():
        out.write(s.pop() + '\n')
    out.close()


reverse_file("sample.txt")
f0 = open('sample.txt', 'r', encoding='utf-8')
f1 = f0.read()
print(f1)

代码中部分面向对象知识的解释2

结果展示:
实现文件中各行的逆置

2)括号和HTML标记匹配

括号匹配

目标:判断算术表达式中分隔符是否成对
原理:栈的先进后出
步骤:扫描算术表达式的字符串,遇到各种左括号就入栈,遇到匹配的右括号,就将左括号出栈。最后,栈为空为成对,栈不为空为不成对。
代码展示:

def is_match(str):                                      
    left = '([{'                                        
    right = ')]}'                                       
    s = Arraystack()                                    
    for ch in str:                                      
        if ch in left:                                  
            s.push(ch)                                  
        elif ch in right:                               
            if s.is_empty():                            
                return False                            
            if right.index(ch) != left.index(s.pop()):  
                #  ch在right字符串中的位置和s.pop()在left字符串中的位置  
                #  判断当ch为右括号时,是否与栈顶元素匹配                 
                return False                            
        return s.is_empty()                             

代码中部分面向对象知识的解释3

结果展示:(测试用例"[(5+x)-(y+z)]")

括号匹配

HTML标记匹配

目标:判断HTML文本标签是否成对
原理:栈的先进后出
步骤:扫描原始字符串……开始标签被压入栈中,当其从栈中弹出时,即与解释标签进行匹配。
代码展示:

def ismatch_html(str1):
    s = Arraystack()
    j = str1.find('<')
    while j != -1:
        k = str1.find('<', j + 1)
        if k == -1:
            return False
        tag = str1[j + 1:k]
        if not tag.startswith('/'):
            s.push(tag)
        else:
            if s.is_empty():
                return False
            if tag[1:] != s.pop():
                return False
        j = str1.find('<', k + 1)
    return s.is_empty()

二、队列

1.队列的操作

enqueue()、dequeue()、first()、is_empty()、len()

2.基于数组的队列实现

男朋友生病了,下午睡太久了,梦华录太好看了,写不完了,明天再说

三、双端队列

四、链表


  1. 在Python中,以下划线开头的变量名和方法名有特殊的含义,尤其是在类的定义中。
    1 _xxx:保护成员,类对象和派生类对象可以访问这些成员,在类的外面一般不建议直接访问;
    2 _ xxx _:系统定义的特殊成员;
    3 _ _xxx:私有成员,以两个或更多下划线开头但不能以两个或更多下划线结束的成员,只有类自己能访问,子类对象不能直接访问到这个成员,但在类外部可以通过“对象名.类名 _xxx”这样的特殊方式来访问。
    注意:Python中不存在严格意义上的私有成员。 ↩︎

  2. line.rstrip(‘\n’):删除string字符串末尾的指定字符,这里是换行符。 ↩︎

  3. index() 函数用于从列表中找出某个值第一个匹配项的索引位置。 ↩︎

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值