Java中基于Stack实现roll(n,k)栈元素旋转操作的开发问题
完整实现方案
第一步:参数校验
按照要求先做合法性判断,任意条件不满足直接抛出指定异常:
- 校验规则:
n为非负整数(n >= 0)k为非负整数(k >= 0)n不超过当前栈的总元素数量(n <= stack.size())
- 异常抛出:触发任意校验规则时,直接抛出携带
"roll: argument out of range"信息的RuntimeException
第二步:核心旋转逻辑实现
操作规则对应流程:
- 特殊边界处理:如果操作范围
n=0,不需要做任何改动直接返回,避免后续取模操作出现除零错误 - 临时存储操作范围内的栈顶元素:循环弹出栈顶的
n个元素存入临时列表,此时列表顺序刚好对应“组内从栈顶到组内底部”的排列 - 优化旋转次数:由于每完成
n次旋转,组内元素就会回到初始顺序,因此实际需要旋转的次数为k = k % n,减少无意义操作 - 执行旋转:重复
k次操作——取出临时列表的第一个元素(即组内当前最顶端的元素),追加到列表末尾,对应规则里“把组最顶端的元素移到组最后位置”的要求 - 元素回栈:将调整完顺序的临时列表元素,从列表末尾(对应组内最靠近原栈底部的位置)开始依次push回栈,保证栈内其余未操作部分的顺序完全不变
补全后的完整roll函数代码
// 需补充导入:import java.util.ArrayList; public static void roll(Stack<String> stack, int n, int k) { // 参数合法性校验 if (n < 0 || k < 0 || n > stack.size()) { throw new RuntimeException("roll: argument out of range"); } // 边界:操作元素为0直接返回 if (n == 0) { return; } // 临时存储栈顶n个元素 ArrayList<String> temp = new ArrayList<>(); for (int i = 0; i < n; i++) { temp.add(stack.pop()); } // 优化旋转次数 int rotateTimes = k % n; // 执行旋转 for (int i = 0; i < rotateTimes; i++) { String topElement = temp.remove(0); temp.add(topElement); } // 元素放回栈 for (int i = temp.size() - 1; i >= 0; i--) { stack.push(temp.get(i)); } }
测试用例匹配验证
- 用例1:输入参数
n=4, k=1,执行后栈顺序为[D, A, B, C],和示例输出完全一致 - 用例2:输入参数
n=3, k=2,执行后栈顺序为[A, C, D, B],和示例输出完全一致 - 用例3:输入参数
n=2, k=4,旋转次数取模后为0,栈保持原顺序[A, B, C, D],和示例输出完全一致
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

