为什么先谈 ADT 契约
资料结构课最容易出错的地方,不是语法,而是操作语义。ADT 先规定 “能做什么、做完要保证什么、错误情况如何处理”,然后才选实现(array 或 linked list)。
Stack 操作语义
定义
Stack 核心操作
push(x):把x放到栈顶。pop():移除并返回栈顶元素。top():读取栈顶但不移除。isEmpty():检查是否为空。
LIFO 是核心不变量:后进先出。
Queue 操作语义
定义
Queue 核心操作
enqueue(x):从尾端加入x。dequeue():由前端移除并返回。front():读取前端但不移除。isEmpty():检查是否为空。
Queue 的不变量是 FIFO:先进先出。
C 语言 function pointer 操作分派
把 ADT 操作函数放进 function-pointer table,可在不改 client call-site 下切换实现。这是 C 中常见的接口稳定策略。
边读边试
追踪 ADT 操作语义
此步进器按操作展示状态转移,让你可直接核对 ADT 契约。
行变换: push(10)
stack: [10]
queue: []
栈顶现为 10。
常见错误
常见错误
把 stack/queue 语义混用
函数名叫 queue,但行为做成 LIFO,属于契约破坏。
常见错误
忽略空结构前置条件
对空 stack 做 pop、对空 queue 做 dequeue,必须明确错误策略。
快速检查
快速检查
push(1), push(2), pop() 后 stack 剩下什么?
按 LIFO 判断。
解答
答案
快速检查
enqueue(4), enqueue(7), dequeue() 会返回什么?
按 FIFO 判断。
解答