P14193.操作历史管理器的撤销/重做能力(100分)
题目内容
实现一个操作历史管理器,使用双向链表存储执行过的操作。支持执行新操作、撤销和重做功能。
功能说明
- 执行操作(execute {操作描述}):执行新操作,并清除当前操作之后的所有历史记录
- 撤销(undo):回退到上一个操作状态(上一个操作状态可以为从未执行过任何操作的状态,若当前状态已经是从未执行过任何操作的状态,则 undo 失败)
- 重做(redo):前进到下一个操作状态(下一个操作状态是之前撤销过的操作,若没有进行过撤销操作(即链表的下一个操作状态不存在),则 redo 失败)
补充说明
输入保证
- 命令只会出现 execute {操作描述}、undo、redo 三种类型
输出要求
-
执行完所有命令后,返回当前操作的描述
-
若执行 undo 时,当前状态是从未执行过任何操作的状态,立即返回 "undo failed",不继续执行后续命令。(注意:undo 可以撤销到从未执行过任何操作的状态)
-
若执行 redo 时无下一个操作,立即返回 "redo failed",不继续执行后续命令
-
若当前状态是从未执行过任何操作,当前操作描述为空字符串 ""
样例1
输入
[["execute", "insert hello"], ["execute", "newline"], ["execute", "insert woo"], ["undo"], ["execute", "insert world"], ["undo"]]
输出
"newline"
说明
-
执行 insert hello → 当前:insert hello
-
执行 newline → 当前:newline
-
执行 insert woo → 当前:insert woo
-
撤销 → 当前:newline(当前回滚到上一步的状态)
-
执行 insert world → 当前:insert world(清除任何后续历史)
-
撤销 → 当前:newline
样例2
输入
[[]]
输出
""
说明
当前状态是从未执行过任何操作,输出: ""
样例3
输入
[["execute", "insert hello"], ["undo"]]
输出
""
说明
-
执行 insert hello → 当前:insert hello
-
撤销 → 当前:""(当前状态是从未执行过任何操作,输出: "")
样例4
输入
[["execute","insert hello"],["undo"],["redo"]]
输出
"insert hello"
说明
-
执行 insert hello → 当前:insert hello
-
撤销 → 当前:""
-
重做 → 当前:insert hello
样例5
输入
[["execute","insert V"],["execute","insert W"],["execute","insert A"],["undo"],["undo"],["execute","insert IEW"],["redo"]]
输出
"redo failed"
说明
-
执行 insert V → 当前 insert V
-
执行 insert W → 当前:insert W
-
执行 insert A → 当前:insert A
-
撤销 → 当前:insert W(当前回滚到上一步的状态)
-
撤销 → 当前:insert V(当前回滚到上一步的状态)
-
执行 insert IEW → 当前:insert IEW(清除任何后续历史)
-
重做 → 重做失败,输出"redo failed",由于上一步已经清空操作历史,所以重做失败