You need to enable JavaScript to run this app. Java中基于Stack实现roll(n,k)栈元素旋转操作的开发问题
优惠活动
大模型
产品
解决方案
定价
更多

Java中基于Stack实现roll(n,k)栈元素旋转操作的开发问题

完整实现方案

第一步:参数校验

按照要求先做合法性判断,任意条件不满足直接抛出指定异常:

  • 校验规则:
    • n 为非负整数(n >= 0)
    • k 为非负整数(k >= 0)
    • n 不超过当前栈的总元素数量(n <= stack.size())
  • 异常抛出:触发任意校验规则时,直接抛出携带"roll: argument out of range"信息的RuntimeException

第二步:核心旋转逻辑实现

操作规则对应流程:

  1. 特殊边界处理:如果操作范围n=0,不需要做任何改动直接返回,避免后续取模操作出现除零错误
  2. 临时存储操作范围内的栈顶元素:循环弹出栈顶的n个元素存入临时列表,此时列表顺序刚好对应“组内从栈顶到组内底部”的排列
  3. 优化旋转次数:由于每完成n次旋转,组内元素就会回到初始顺序,因此实际需要旋转的次数为k = k % n,减少无意义操作
  4. 执行旋转:重复k次操作——取出临时列表的第一个元素(即组内当前最顶端的元素),追加到列表末尾,对应规则里“把组最顶端的元素移到组最后位置”的要求
  5. 元素回栈:将调整完顺序的临时列表元素,从列表末尾(对应组内最靠近原栈底部的位置)开始依次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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.31 10:36:06