数据类型
数据类型:是指一组性质相同的值的集合及定义在此集合上的一些操作的总称。
数据类型的定义
数据类型可以分两类:原子类型和结构类型。
原子类型:是不可以再分解的基本类型,包括整型、实型、字符型等
结构类型:由若干个类型组合而成,是可以再分解。例如整型数组是由若干整型数据组成的。
eg
原子类型相当于化学中的原子,结构类型则是化学中可分解的化合物。
抽象数据类型
抽象是指取出事物具有的普遍性的本质。
抽象的三无关:1.与存放数据的机器无关。
2.与数据存储的物理结构无关。
3.与实现操作的算法和编程语言无关。
抽象数据类型(Abstract Data Type,ADT)
定义:一个数学模型及定义在该模型上的一组操作。(抽象数据类型的定义仅取决于它的一组逻辑特性,与计算机内部如何表示和实现无关。)
抽象数据类型体现了程序设计中的问题分解、抽象、和信息隐藏的特性。
抽象数据类型的主要特征包括数据抽象和数据封装。数据抽象是指用ADT描述程序处理的实体时,强调的是其本质的特征,无论内部结构如何变化,只要本质特性不变,就不影响其外部使用。
抽象数据类型(Abstract Data Type,ADT)的格式通常包括以下部分:
数据对象:定义数据对象的集合。数据对象是抽象数据类型的实例或值。
数据关系:描述数据对象之间的关系。这些关系可以是结构性的(如树或图的关系),也可以是逻辑性的(如相等或排序关系)。
基本操作:定义在数据对象上的一组操作。这些操作描述了可以对数据对象执行的行为或计算。它们通常包括创建(构造函数)、销毁(析构函数)、访问(如读取数据)、修改(如更新数据)和查询(如查找或比较)等操作
eg 栈(Stack)
数据对象:一个具有特定访问原则(LIFO,后进先出)的项序列。
数据关系:项之间的关系是通过它们在栈中的位置来定义的,即后入栈的项位于先入栈的项之上。
基本操作:
push(item):将一个新项添加到栈顶。
pop():从栈顶移除并返回一个项。如果栈为空,则可能引发异常或错误。
peek():返回栈顶项的值,但不移除它。如果栈为空,则可能返回特殊值或引发异常。
isEmpty():检查栈是否为空。
size():返回栈中项的数量。
栈的一个例举代码(Python中注释用井号:#
使用三引号( """ """)字符串作为多行注释)
class Stack:
def __init__(self):
self.items = []
def push(self, item):
"""将一个新项添加到栈顶"""
self.items.append(item)
def pop(self):
"""从栈顶移除并返回一个项。如果栈为空,则引发异常"""
if not self.is_empty():
return self.items.pop()
else:
raise IndexError("pop from an empty stack")
def peek(self):
"""返回栈顶项的值,但不移除它。如果栈为空,则返回None或引发异常"""
if not self.is_empty():
return self.items[-1]
else:
return None # 或者可以抛出异常
def is_empty(self):
"""检查栈是否为空"""
return len(self.items) == 0
def size(self):
"""返回栈中项的数量"""
return len(self.items)
# 使用栈的示例
s = Stack()
s.push("apple")
s.push("banana")
s.push("cherry")
print(s.peek()) # 输出: cherry
print(s.size()) # 输出: 3
print(s.pop()) # 输出: cherry
print(s.pop()) # 输出: banana
print(s.is_empty()) # 输出: False
print(s.pop()) # 输出: apple
print(s.is_empty()) # 输出: True
# 尝试从空栈中弹出元素将引发异常
# s.pop() # 抛出 IndexError: pop from an empty stack