购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

2.4.2 栈

栈(stack)只允许在栈顶操作,不允许在中间位置进行插入和删除操作,不支持数组表示法和随机访问。使用stack时需要引入头文件#include<stack>。栈的基本操作很简单,包括入栈、出栈、取栈顶、判断栈空、求栈大小。

● stack<int> s :创建一个空栈 s ,数据类型为int。

● push( x ): x 入栈。

● pop():出栈。

● top():取栈顶(未出栈)。

● empty():判断栈是否为空,若为空则返回true。

● size():求栈大小,返回栈中的元素个数。

训练 Web导航

题目描述(POJ1028): 标准的Web浏览器包含在最近访问过的页面中向后和向前移动的功能。实现这些特性的一种方法是使用两个栈来跟踪前后移动可以到达的页面。支持以下命令。

● BACK:将当前页面推到前向栈的顶部。从后向栈的顶部弹出页面,使其成为新的当前页面。如果后向栈为空,则忽略该命令。

● FORWARD:将当前页面推到后向栈的顶部。从前向栈顶部弹出页面,使其成为新的当前页面。如果前向栈为空,则忽略该命令。

● VISIT:将当前页面推到后向栈的顶部,使URL成为新的当前页面。前向栈清空。

● QUIT:退出浏览器。

假设浏览器的最初页面为URL ***###.acm.org/(对“http://”用“***”代替,对“www”用“###”代替)。

输入: 输入是一系列BACK、FORWARD、VISIT、QUIT命令。URL没有空白,最多有70个字符。任何时候,在每个栈中都不会超过100个元素。QUIT命令表示输入结束。

输出: 对于除QUIT外的每个命令,如果不忽略该命令,则在执行该命令后单行输出当前页的URL,否则输出“Ignored”。QUIT命令没有输出。

1. 算法设计

本题模拟Web浏览器中的前进和后退两个操作,可以使用两个stack解决。backward表示后向栈;forward表示前向栈。

(1)初始时,当前页面cur为“***###.acm.org/”。

(2)BACK:如果后向栈为空,则忽略该命令;否则将当前页面放入前向栈,从后向栈的顶部弹出页面,使其成为新的当前页面。输出当前页面。

(3)FORWARD:如果前向栈为空,则忽略该命令;否则将当前页面放入后向栈,从前向栈的顶部弹出页面,使其成为新的当前页面。输出当前页面。

(4)VISIT:将当前页面放入后向栈的顶部,并使URL成为新的当前页面。前向栈清空。输出当前页面。

(5)QUIT:退出浏览器。

2. 完美图解:

(1)初始时,cur为“***###.acm.org/”。

(2)VISIT ***acm.ashland.edu/,将当前页面放入后向栈的顶部,并使URL成为新的当前页面。前向栈清空。

输出cur:***acm.ashland.edu/。

(3)VISIT ***acm.baylor.edu/acmicpc/,将当前页面放入后向栈的顶部,并使URL成为新的当前页面。前向栈清空。

输出cur:***acm.baylor.edu/acmicpc/。

(4)BACK:如果后向栈为空,则忽略该命令;否则将当前页面放入前向栈,从后向栈的顶部弹出页面,使其成为新的当前页面。输出当前页面。

输出cur:***acm.ashland.edu/。

(5)BACK:如果后向栈为空,则忽略该命令;否则将当前页面放入前向栈,从后向栈的顶部弹出页面,使其成为新的当前页面。输出当前页面。

输出cur:***###.acm.org/。

(6)BACK:后向栈为空,输出忽略命令。

输出:Ignored。

(7)FORWARD:如果前向栈为空,则忽略该命令;否则将当前页面放入后向栈,从前向栈的顶部弹出页面,使其成为新的当前页面。输出当前页面。

输出cur:***acm.ashland.edu/。

(8)VISIT ***###.ibm.com/,将当前页面放入后向栈的顶部,并使URL成为新的当前页面。前向栈清空。

输出cur:***###.ibm.com/。

(9)BACK:如果后向栈为空,则忽略该命令;否则将当前页面放入前向栈,从后向栈的顶部弹出页面,使其成为新的当前页面。输出当前页面。

输出cur:***acm.ashland.edu/。

(10)BACK:如果后向栈为空,则忽略该命令;否则将当前页面放入前向栈,从后向栈的顶部弹出页面,使其成为新的当前页面。输出当前页面。

输出cur:***###.acm.org/。

(11)FORWARD:如果前向堆为空,则忽略该命令;否则将当前页面放入后向栈,从前向栈的顶部弹出页面,使其成为新的当前页面。输出当前页面。

输出cur:***acm.ashland.edu/。

(12)FORWARD:如果前向栈为空,则忽略该命令;否则将当前页面放入后向栈,从前向栈的顶部弹出页面,使其成为新的当前页面。输出当前页面。

输出cur:***###.ibm.com/。

(13)FORWARD:前向栈为空,忽略该命令。

输出:Ignored。

(14)QUIT:结束。 hHIA3bgmhpi1NM9eG6/hH42PxEnvLbwJAEdjOBFu11MF2056s+D27sx0eFr/cOvH

3. 算法实现
点击中间区域
呼出菜单
上一章
目录
下一章
×