目录
现在图书馆有一堆图书需要放入书架,并且图书馆的书架是一种特殊的数据结构,只能按照 一定 的顺序 放入 和 拿取 书籍。
给定一个表示图书放入顺序的整数序列
putIn
,请判断序列takeOut
是否为按照正确的顺序拿取书籍的操作序列。你可以假设放入书架的所有书籍编号都不相同。示例 1:
输入:putIn = [6,7,8,9,10,11], takeOut = [9,11,10,8,7,6] 输出:true 解释:我们可以按以下操作放入并拿取书籍: push(6), push(7), push(8), push(9), pop() -> 9, push(10), push(11),pop() -> 11,pop() -> 10, pop() -> 8, pop() -> 7, pop() -> 6示例 2:
输入:putIn = [6,7,8,9,10,11], takeOut = [11,9,8,10,6,7] 输出:false 解释:6 不能在 7 之前取出。提示:
0 <= putIn.length == takeOut.length <= 1000
0 <= putIn[i], takeOut < 1000
putIn
是takeOut
的排列。
题解:
- 首先,创建一个
Stack
对象stack
,用于模拟存储书籍的入栈顺序。- 然后,使用一个整型变量
i=0
来标识takeOut
数组的下标- 接下来,通过遍历
putIn
数组中的每个元素num
,将其入栈stack.push(num)
- 然后,使用一个循环判断栈顶元素和当前
takeOut
数组的元素takeOut[i]
是否相等如果相等,则说明可以从栈中取出对应的书籍,并且i
增加一位,继续判断下一个takeOut
元素与栈顶元素是否相等。直到栈为空或者栈顶元素与当前takeOut
元素不相等,跳出循环- 最后,返回
stack.isEmpty()
的结果,如果栈为空则表示所有书籍都被正确地取出,返回true
,否则返回false
表示取出顺序不合法。代码:
class Solution { public boolean validateBookSequences(int[] putIn, int[] takeOut) { // 模拟存储putIn入栈,方便与takeOut对比 Stackstack =new Stack<>(); // 标识takeOut下标 int i=0; for(int num : putIn){ stack.push(num); // 循环判断栈顶元素是否为takeOut当前元素 while(!stack.isEmpty()&&stack.peek()==takeOut[i]){ stack.pop(); i++; } } return stack.isEmpty(); } }运行结果: