数据结构与算法(3)--栈抽象数据类型及Python实现

简介: 1. 什么是栈?是一种有次序的数据项集合,在栈中数据项的加入和移除都发生在同一端。一端叫做栈顶,另一端叫做栈底。

1. 什么是栈?

是一种有次序的数据项集合,在栈中数据项的加入和移除都发生在同一端。一端叫做栈顶,另一端叫做栈底。

1.1. 特点

  • 距离在栈底比较近的数据项,待的时间就比较长。
  • 抽象数据类型“栈”是一个有次序的数据集, 每个数据项仅从“栈顶”一端加入到数据集中、 从数据集中移除, 栈具有后进先出LIFO的特性。

1.2. 抽象数据类型“栈”定义为如下的操作

Stack():创建一个空栈,不包含任何数据项

push(item):将item加入栈顶,无返回值

pop():将栈顶数据项移除,并返回,栈被修改

peek(): “窥视”栈顶数据项,返回栈顶的数据项但不移除,栈不被修改

isEmpty():返回栈是否为空栈

size():返回栈中有多少个数据项


1.3. 用Python实现ADT Stack

将ADT Stack实现为Python的一个Class,将ADT Stack的操作实现为Class的方法,由于Stack是一个数据集,所以可以采用Python,的原生数据集来实现,我们选用最常用的数据集List来实现。

class Stack:
    def __init__(self):
        self.item = []
    def isEmpty(self):
        if self.item == []:
            return True
        else:
            return False
    def push(self,item):
        self.item.append(item)
    def pop(self):
        return self.item.pop()
    def peek(self):
        return self.item[-1]
    def size(self):
        return len(self.item)

2. 栈的应用:简单的括号匹配

2.1. 准则

括号的使用必须遵循 “平衡”规则首先,每个开括号要恰好对应一个闭括号;其次,每对开闭括号要正确的嵌套

正确的括号:(()()()()), (((()))),(()((())()))

错误的括号:((((((()), ())), (()()(()

2.2. Python程序

def perChecker(symbolString):
    stack = Stack()
    balaced = True
    index = 0
    while index < len(symbolString) and balaced:
        symbol = symbolString[index]
        if symbol=="(":
            stack.push(symbol)
        else:
            if stack.isEmpty():
                balaced = False
            else:
                stack.pop()
        index = index + 1
    if balaced == True and stack.isEmpty():
        return True
    else:
        return False
if __name__ == "__main__":
    a = perChecker("(()")
    print(a)
    b = perChecker("()()")    
    print(b)

结果显示

False
True

2.3. 更多种的括号的匹配

在实际的应用里, 我们会碰到更多种括号

如python中列表所用的方括号“[]”

字典所用的花括号“{}”

元组和表达式所用的圆括号“()”

这些不同的括号有可能混合在一起使用,因此就下面这些是匹配的

{ { ( [ ] [ ] ) } ( ) }

[ [ { { ( ( ) ) } } ] ]

[ ] [ ] [ ] ( ) { }

下面这些是不匹配的

( [ ) ] ( ( ( ) ] ) )

[ { ( ) ]

python程序

def perChecker(symbolString):
    stack = Stack()
    balaced = True
    index = 0
    while index < len(symbolString) and balaced:
        symbol = symbolString[index]
        if symbol in "([{":
            stack.push(symbol)
        else:
            if stack.isEmpty():
                balaced = False
            else:
                a = stack.pop()
                if not matches(a,symbol):
                    balaced = False
        index = index + 1
    if balaced == True and stack.isEmpty():
        return True
    else:
        return False
def matches(open,close):
    opens = "({["
    closer = ")}]"
    return opens.index(open) == closer.index(close)
if __name__ == "__main__":
    a = perChecker("([})")
    print(a)
    b = perChecker("()()")    
    print(b)

结果

False
True

3. 栈的应用:十进制转换为二进制

3.1. 特点

“除以2”的过程, 得到的余数是从低到高的次序, 而输出则是从高到低, 所以需要一个栈来反转次序。

如下图所示

3.2. python程序实现

def dividBy2(decNumber):
    divstack = Stack()
    while decNumber > 0:
        remainder = decNumber % 2
        divstack.push(remainder)
        decNumber = decNumber // 2 #取整
    str1 = ""
    while not divstack.isEmpty():
        str1 = str1 + str(divstack.pop())
    return str1
if __name__ == "__main__":
    str_ = dividBy2(35)
    print(str_)

结果

100011
• 1

相关文章
|
8天前
|
缓存 算法 Java
JVM知识体系学习六:JVM垃圾是什么、GC常用垃圾清除算法、堆内存逻辑分区、栈上分配、对象何时进入老年代、有关老年代新生代的两个问题、常见的垃圾回收器、CMS
这篇文章详细介绍了Java虚拟机(JVM)中的垃圾回收机制,包括垃圾的定义、垃圾回收算法、堆内存的逻辑分区、对象的内存分配和回收过程,以及不同垃圾回收器的工作原理和参数设置。
29 4
JVM知识体系学习六:JVM垃圾是什么、GC常用垃圾清除算法、堆内存逻辑分区、栈上分配、对象何时进入老年代、有关老年代新生代的两个问题、常见的垃圾回收器、CMS
|
10天前
|
Python
【10月更文挑战第7天】「Mac上学Python 13」基础篇7 - 数据类型转换与NoneType详解
本篇将详细介绍Python中的常见数据类型转换方法以及 `NoneType` 的概念。包括如何在整数、浮点数、字符串等不同数据类型之间进行转换,并展示如何使用 `None` 进行初始赋值和处理特殊情况。通过本篇的学习,用户将深入理解如何处理不同类型的数据,并能够在代码中灵活使用 `None` 处理未赋值状态。
47 2
【10月更文挑战第7天】「Mac上学Python 13」基础篇7 - 数据类型转换与NoneType详解
|
11天前
|
存储 机器学习/深度学习 算法
蓝桥杯练习题(三):Python组之算法训练提高综合五十题
蓝桥杯Python编程练习题的集合,涵盖了从基础到提高的多个算法题目及其解答。
18 3
蓝桥杯练习题(三):Python组之算法训练提高综合五十题
|
11天前
|
算法 程序员 索引
数据结构与算法学习七:栈、数组模拟栈、单链表模拟栈、栈应用实例 实现 综合计算器
栈的基本概念、应用场景以及如何使用数组和单链表模拟栈,并展示了如何利用栈和中缀表达式实现一个综合计算器。
16 1
数据结构与算法学习七:栈、数组模拟栈、单链表模拟栈、栈应用实例 实现 综合计算器
|
11天前
初步认识栈和队列
初步认识栈和队列
36 10
|
5天前
数据结构(栈与列队)
数据结构(栈与列队)
11 1
|
8天前
|
机器学习/深度学习 人工智能 算法
【玉米病害识别】Python+卷积神经网络算法+人工智能+深度学习+计算机课设项目+TensorFlow+模型训练
玉米病害识别系统,本系统使用Python作为主要开发语言,通过收集了8种常见的玉米叶部病害图片数据集('矮花叶病', '健康', '灰斑病一般', '灰斑病严重', '锈病一般', '锈病严重', '叶斑病一般', '叶斑病严重'),然后基于TensorFlow搭建卷积神经网络算法模型,通过对数据集进行多轮迭代训练,最后得到一个识别精度较高的模型文件。再使用Django搭建Web网页操作平台,实现用户上传一张玉米病害图片识别其名称。
22 0
【玉米病害识别】Python+卷积神经网络算法+人工智能+深度学习+计算机课设项目+TensorFlow+模型训练
|
11天前
|
算法
数据结构与算法二:栈、前缀、中缀、后缀表达式、中缀表达式转换为后缀表达式
这篇文章讲解了栈的基本概念及其应用,并详细介绍了中缀表达式转换为后缀表达式的算法和实现步骤。
28 3
|
10天前
|
存储 JavaScript 前端开发
为什么基础数据类型存放在栈中,而引用数据类型存放在堆中?
为什么基础数据类型存放在栈中,而引用数据类型存放在堆中?
37 1
|
13天前
|
存储 安全 Java
【用Java学习数据结构系列】探索栈和队列的无尽秘密
【用Java学习数据结构系列】探索栈和队列的无尽秘密
25 2