Files
house/house_service2.0.py
2026-05-08 17:32:18 +08:00

219 lines
7.1 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
from house.house_operation import read_houses, write_houses
# V2.0新增:导入新增的栈数据函数
from house.house_operation import read_stack, write_stack
from datetime import datetime
# V1.0
def get_next_house_id():
"""
生成下一个房源ID(保证ID唯一)
时间复杂度:O(n)(遍历所有房源找最大ID)
return: 下一个可用的ID(整数)
"""
houses = read_houses()
if not houses:
return 1 # 无房源时,第一个ID为1
# 找到最大ID,加1作为新ID
max_id = max(house["id"] for house in houses)
return max_id + 1
def add_house(address, price, area, house_type):
"""
新增房源(线性表的尾部插入操作)
时间复杂度:O(n)read/write各O(n),整体O(n)
空间复杂度:O(n)(存储所有房源数据)
param address: 房源地址(字符串)
param price: 租金(整数/浮点数)
param area: 面积(整数/浮点数)
param house_type: 户型(字符串,如"一居室")
return: 新增成功返回True,失败返回False
"""
# 基础数据校验(非空+数值合法性)
if not address or not house_type:
print("错误:地址和户型不能为空!")
return False
if not isinstance(price, (int, float)) or price <= 0:
print("错误:租金必须是正数!")
return False
if not isinstance(area, (int, float)) or area <= 0:
print("错误:面积必须是正数!")
return False
# 构建新房源字典(线性表的元素)
new_house = {
"id": get_next_house_id(),
"address": address,
"price": price,
"area": area,
"house_type": house_type
}
# 读取现有房源(线性表),新增元素(尾部插入)
houses = read_houses()
houses.append(new_house) # 线性表append操作,时间复杂度O(1)
# 写入文件
write_houses(houses)
print(f"房源新增成功!房源ID{new_house['id']}")
return True
def delete_house(house_id):
"""
删除房源(线性表的指定位置删除操作)
时间复杂度:O(n)(遍历找ID+写入文件,整体O(n))
空间复杂度:O(n)(存储所有房源数据)
param house_id: 要删除的房源ID(整数)
return: 删除成功返回True,失败返回False
"""
houses = read_houses()
# 遍历线性表,找到对应ID的房源
for index, house in enumerate(houses):
if house["id"] == house_id:
del houses[index] # 线性表删除操作,时间复杂度O(n)(后续元素前移)
write_houses(houses)
print(f"房源ID {house_id} 删除成功!")
return True
print(f"错误:未找到房源ID {house_id}")
return False
def update_house(house_id, new_info):
"""
修改房源信息(线性表的指定元素更新操作)
时间复杂度:O(n)(遍历找ID+写入文件,整体O(n))
空间复杂度:O(n)(存储所有房源数据)
param house_id: 要修改的房源ID(整数)
param new_info: 要修改的字段字典(如{"price": 5500, "area": 85}
return: 修改成功返回True,失败返回False
"""
houses = read_houses()
# 遍历线性表,找到对应ID的房源
for house in houses:
if house["id"] == house_id:
# 仅更新传入的有效字段
for key, value in new_info.items():
if key in ["address", "price", "area", "house_type"]:
# 校验数值字段合法性
if key in ["price", "area"]:
if not isinstance(value, (int, float)) or value <= 0:
print(f"错误:{key}必须是正数!")
return False
house[key] = value
write_houses(houses)
print(f"房源ID {house_id} 修改成功!")
return True
print(f"错误:未找到房源ID {house_id}")
return False
def query_house(condition_type, condition_value):
"""
查询房源(线性表的遍历筛选操作)
时间复杂度:O(n)(遍历所有房源,n为房源数)
空间复杂度:O(k)(k为符合条件的房源数,最坏O(n))
param condition_type: 查询条件类型("id"/"address"/"price"/"house_type"
param condition_value: 查询条件值
return: 符合条件的房源列表
"""
houses = read_houses()
result = []
# 按条件遍历筛选
for house in houses:
# 处理ID查询(整数匹配)
if condition_type == "id":
if house["id"] == int(condition_value):
result.append(house)
# 处理地址查询(模糊匹配)
elif condition_type == "address":
if condition_value in house["address"]:
result.append(house)
# 处理户型查询(精确匹配)
elif condition_type == "house_type":
if house["house_type"] == condition_value:
result.append(house)
# 处理租金查询(数值匹配,示例:查询等于该价格的房源)
elif condition_type == "price":
if house["price"] == float(condition_value):
result.append(house)
else:
print("错误:不支持的查询条件类型!")
return []
return result
# V2.0 新增代码:栈业务逻辑
# V2.0 新增:栈配置
MAX_STACK_LENGTH = 100 # 栈最大存储长度
# V2.0 新增:栈核心操作
def push_operation_stack(operation_info):
"""
栈顶添加,先进后出
"""
time_str = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
full_info = f"[{time_str}] {operation_info}"
stack = read_stack("operation")
stack.append(full_info)
# 超出长度则删除最早的栈底元素
if len(stack) > MAX_STACK_LENGTH:
stack.pop(0)
write_stack("operation", stack)
def push_browse_stack(house_id):
"""
V2.0房源浏览历史入栈
"""
stack = read_stack("browse")
# 去重:避免同一房源重复入栈顶
if stack and stack[-1] == house_id:
return
stack.append(house_id)
if len(stack) > MAX_STACK_LENGTH:
stack.pop(0)
write_stack("browse", stack)
def pop_operation_stack():
"""
V2.0新增操作记录出栈(获取并删除最新的栈顶记录)
"""
stack = read_stack("operation")
if not stack:
return None
latest_op = stack.pop()
write_stack("operation", stack)
return latest_op
def pop_browse_stack():
"""
V2.0新】浏览历史出栈(获取并删除最新浏览的房源)
"""
stack = read_stack("browse")
if not stack:
return None
latest_hid = stack.pop()
write_stack("browse", stack)
return latest_hid
def get_recent_records(stack_type, limit=10):
"""
V2.0新增获取栈内最新的N条记录(从新到旧)
"""
stack = read_stack(stack_type)
return stack[-limit:][::-1]
def clear_stack(stack_type):
"""
V2.0新增清空指定栈
"""
write_stack(stack_type, [])
print(f"{stack_type}记录已清空!")