Hello 算法 1.1.0 Swift版然而,由于链表节点需要额外存储指针,因此链表节点占用的空间相对较大。 综上,我们不能简单地确定哪种实现更加节省内存,需要针对具体情况进行分析。 5.1.4 栈的典型应用 ‧ 浏览器中的后退与前进、软件中的撤销与反撤销。每当我们打开新的网页,浏览器就会对上一个网页执 行入栈,这样我们就可以通过后退操作回到上一个网页。后退操作实际上是在执行出栈。如果要同时支 持后退和前进,那么需要两个栈来配合实现。 ‧ 同时提供更高的自由度。 我们知道,软件的“撤销”功能通常使用栈来实现:系统将每次更改操作 push 到栈中,然后通过 pop 实现撤 销。然而,考虑到系统资源的限制,软件通常会限制撤销的步数(例如仅允许保存 50 步)。当栈的长度超过 50 时,软件需要在栈底(队首)执行删除操作。但栈无法实现该功能,此时就需要使用双向队列来替代栈。请 注意,“撤销”的核心逻辑仍然遵循栈的先入后出原则,只是双向队列能够更加灵活地实现一些额外逻辑。 队列的逻辑,因此可以实现栈与队列 的所有应用,并且更加灵活。 Q:撤销(undo)和反撤销(redo)具体是如何实现的? 使用两个栈,栈 A 用于撤销,栈 B 用于反撤销。 1. 每当用户执行一个操作,将这个操作压入栈 A ,并清空栈 B 。 2. 当用户执行“撤销”时,从栈 A 中弹出最近的操作,并将其压入栈 B 。 3. 当用户执行“反撤销”时,从栈 B 中弹出最近的操作,并将其压入栈 A 。0 码力 | 379 页 | 18.47 MB | 1 年前3
Hello 算法 1.2.0 简体中文 Swift 版然而,由于链表节点需要额外存储指针,因此链表节点占用的空间相对较大。 综上,我们不能简单地确定哪种实现更加节省内存,需要针对具体情况进行分析。 5.1.4 栈的典型应用 ‧ 浏览器中的后退与前进、软件中的撤销与反撤销。每当我们打开新的网页,浏览器就会对上一个网页执 行入栈,这样我们就可以通过后退操作回到上一个网页。后退操作实际上是在执行出栈。如果要同时支 持后退和前进,那么需要两个栈来配合实现。 ‧ 同时提供更高的自由度。 我们知道,软件的“撤销”功能通常使用栈来实现:系统将每次更改操作 push 到栈中,然后通过 pop 实现撤 销。然而,考虑到系统资源的限制,软件通常会限制撤销的步数(例如仅允许保存 50 步)。当栈的长度超过 50 时,软件需要在栈底(队首)执行删除操作。但栈无法实现该功能,此时就需要使用双向队列来替代栈。请 注意,“撤销”的核心逻辑仍然遵循栈的先入后出原则,只是双向队列能够更加灵活地实现一些额外逻辑。 队列的逻辑,因此可以实现栈与队列 的所有应用,并且更加灵活。 Q:撤销(undo)和反撤销(redo)具体是如何实现的? 使用两个栈,栈 A 用于撤销,栈 B 用于反撤销。 1. 每当用户执行一个操作,将这个操作压入栈 A ,并清空栈 B 。 2. 当用户执行“撤销”时,从栈 A 中弹出最近的操作,并将其压入栈 B 。 3. 当用户执行“反撤销”时,从栈 B 中弹出最近的操作,并将其压入栈 A 。0 码力 | 379 页 | 18.48 MB | 10 月前3
Hello 算法 1.0.0 Swift版综上,我们不能简单地确定哪种实现更加节省内存,需要针对具体情况进行分析。 第 5 章 栈与队列 hello‑algo.com 97 5.1.4 栈的典型应用 ‧ 浏览器中的后退与前进、软件中的撤销与反撤销。每当我们打开新的网页,浏览器就会对上一个网页执 行入栈,这样我们就可以通过后退操作回到上一个网页。后退操作实际上是在执行出栈。如果要同时支 持后退和前进,那么需要两个栈来配合实现。 ‧ 同时提供更高的自由度。 我们知道,软件的“撤销”功能通常使用栈来实现:系统将每次更改操作 push 到栈中,然后通过 pop 实现撤 销。然而,考虑到系统资源的限制,软件通常会限制撤销的步数(例如仅允许保存 50 步)。当栈的长度超过 50 时,软件需要在栈底(队首)执行删除操作。但栈无法实现该功能,此时就需要使用双向队列来替代栈。请 注意,“撤销”的核心逻辑仍然遵循栈的先入后出原则,只是双向队列能够更加灵活地实现一些额外逻辑。 队列的逻辑,因此可以实现栈与队列 的所有应用,并且更加灵活。 Q:撤销(undo)和反撤销(redo)具体是如何实现的? 使用两个栈,栈 A 用于撤销,栈 B 用于反撤销。 1. 每当用户执行一个操作,将这个操作压入栈 A ,并清空栈 B 。 2. 当用户执行“撤销”时,从栈 A 中弹出最近的操作,并将其压入栈 B 。 3. 当用户执行“反撤销”时,从栈 B 中弹出最近的操作,并将其压入栈 A 。0 码力 | 378 页 | 17.59 MB | 1 年前3
Hello 算法 1.0.0b5 Swift版然而,由于链表节点需要额外存储指针,因此链表节点占用的空间相对较大。 综上,我们不能简单地确定哪种实现更加节省内存,需要针对具体情况进行分析。 5.1.4 栈典型应用 ‧ 浏览器中的后退与前进、软件中的撤销与反撤销。每当我们打开新的网页,浏览器就会将上一个网页执 行入栈,这样我们就可以通过后退操作回到上一页面。后退操作实际上是在执行出栈。如果要同时支持 后退和前进,那么需要两个栈来配合实现。 ‧ 程 时提供更高的自由度。 我们知道,软件的“撤销”功能通常使用栈来实现:系统将每次更改操作 push 到栈中,然后通过 pop 实现撤 销。然而,考虑到系统资源的限制,软件通常会限制撤销的步数(例如仅允许保存 50 步)。当栈的长度超过 50 时,软件需要在栈底(即队首)执行删除操作。但栈无法实现该功能,此时就需要使用双向队列来替代栈。 请注意,“撤销”的核心逻辑仍然遵循栈的先入后出原则,只是双向队列能够更加灵活地实现一些额外逻辑。 在前序遍历中搜索节点 13.1.1 尝试与回退 之所以称之为回溯算法,是因为该算法在搜索解空间时会采用“尝试”与“回退”的策略。当算法在搜索过 程中遇到某个状态无法继续前进或无法得到满足条件的解时,它会撤销上一步的选择,退回到之前的状态, 并尝试其他可能的选择。 对于例题一,访问每个节点都代表一次“尝试”,而越过叶结点或返回父节点的 return 则表示“回退”。 值得说明的是,回退并不仅仅包括0 码力 | 376 页 | 30.70 MB | 1 年前3
Hello 算法 1.0.0b2 Swift版当然,由于结点需要额外存储指针,因此 链表结点比数组元素占用更大。 综上,我们不能简单地确定哪种实现更加省内存,需要 case‑by‑case 地分析。 5.1.4. 栈典型应用 ‧ 浏览器中的后退与前进、软件中的撤销与反撤销。每当我们打开新的网页,浏览器就将上一个网页执行 入栈,这样我们就可以通过「后退」操作来回到上一页面,后退操作实际上是在执行出栈。如果要同时 支持后退和前进,那么则需要两个栈来配合实现。 ‧ ,并且提供更高的自由度。 我们知道,软件的“撤销”功能需要使用栈来实现;系统把每一次更改操作 push 到栈中,然后通过 pop 实现 撤销。然而,考虑到系统资源有限,软件一般会限制撤销的步数(例如仅允许保存 50 步),那么当栈的长度 > 50 时,软件就需要在栈底(即队首)执行删除,但栈无法实现,此时就需要使用双向队列来替代栈。注 意,“撤销”的核心逻辑仍然是栈的先入后出,只是双向队列可以更加灵活地实现。0 码力 | 199 页 | 15.72 MB | 1 年前3
Hello 算法 1.0.0b1 Swift版当然,由于结点需要额外存储指针,因此 链表结点比数组元素占用更大。 综上,我们不能简单地确定哪种实现更加省内存,需要 case‑by‑case 地分析。 5.1.4. 栈典型应用 ‧ 浏览器中的后退与前进、软件中的撤销与反撤销。每当我们打开新的网页,浏览器就将上一个网页执行 入栈,这样我们就可以通过「后退」操作来回到上一页面,后退操作实际上是在执行出栈。如果要同时 支持后退和前进,那么则需要两个栈来配合实现。 ‧0 码力 | 190 页 | 14.71 MB | 1 年前3
共 6 条
- 1













