使用堆栈在 Java 中实现 Roll 函数
Implementing Roll function in Java using stacks
我的任务是创建一个名为“roll”的函数,它在指定的堆栈上实现 roll(n,k) 操作。我的函数应该检查 n 和 k 是否都是非负的,并且
n 不大于堆栈大小;如果违反了这些条件中的任何一个,该函数应抛出运行时异常,并显示消息“roll:argument out of range”
这是我目前所拥有的:
import java.util.Stack;
public class PostScript{
public static void main(String [] args){
int n = Integer.parseInt(args[0]);
int k = Integer.parseInt(args[1]);
Stack<String> s = new Stack<String>();
s.push("A"); s.push("B"); s.push("C"); s.push("D");
System.out.println("Initial : " + s);
roll(s,n,k);
System.out.println("after roll(" + n + ", " + k + "): " + s);
}
public static void roll(Stack<String> stack, int n, int k){
}
}
以下是一些测试运行示例:
$ java PostScript 4 1\
Initial : [A, B, C, D]\
after roll(4, 1): [D, A, B, C]
$ java PostScript 3 2\
Initial : [A, B, C, D]\
after roll(3, 2): [A, C, D, B]
$ java PostScript 2 4\
Initial : [A, B, C, D]\
after roll(2, 4): [A, B, C, D]
应用 roll(n,k) 的效果是将堆栈的顶部 n 个元素旋转 k 个位置,其中旋转的一般方向是朝向堆栈的顶部。更具体地说,roll(n,k) 具有移除顶部 n 个元素的效果,将顶部元素循环到最后一个位置 k 次,然后替换堆栈中重新排序的元素。例如,
滚动(4,1) 滚动(3,2) 滚动(2,4)
| D | |丙 | | D | |乙 | | D | | D |
|丙 | |乙 | |丙 | | D | |丙 | | C |
|乙 | -> |一个 | |乙 | -> |丙 | |乙 | -> | B |
|一个 | | D | |一个 | |一个 | |一个 | | |
看来我明白了。这是我的代码,以防将来有人想要这个。
导入 java.util.Stack;
导入 java.util.ArrayList;
public class PostScript {
public static void main(String [] args){
int n = Integer.parseInt(args[0]);
int k = Integer.parseInt(args[1]);
Stack<String> s = new Stack<String>();
s.push("A"); s.push("B"); s.push("C"); s.push("D");
System.out.println("Initial : " + s);
roll(s,n,k);
System.out.println("after roll(" + n + ", " + k + "): " + s);
}
public static void roll(Stack<String> stack, int n, int k){
if(n < 0 || k < 0 || n > stack.size()) throw new IllegalArgumentException("argument of of range");
ArrayList<String> arr = new ArrayList<String>(n);
for(int i = 0; i < n ; i++) arr.add(stack.pop());
int track = 0;
for(int i = 1; i < k; i++){
track++;
if(track == n) track = 0;
}
for(int i = 0; i < n; i++){
stack.push(arr.get(track--));
if(track < 0) track = n - 1;
}
}
}
我的任务是创建一个名为“roll”的函数,它在指定的堆栈上实现 roll(n,k) 操作。我的函数应该检查 n 和 k 是否都是非负的,并且 n 不大于堆栈大小;如果违反了这些条件中的任何一个,该函数应抛出运行时异常,并显示消息“roll:argument out of range” 这是我目前所拥有的:
import java.util.Stack;
public class PostScript{
public static void main(String [] args){
int n = Integer.parseInt(args[0]);
int k = Integer.parseInt(args[1]);
Stack<String> s = new Stack<String>();
s.push("A"); s.push("B"); s.push("C"); s.push("D");
System.out.println("Initial : " + s);
roll(s,n,k);
System.out.println("after roll(" + n + ", " + k + "): " + s);
}
public static void roll(Stack<String> stack, int n, int k){
}
}
以下是一些测试运行示例:
$ java PostScript 4 1\
Initial : [A, B, C, D]\
after roll(4, 1): [D, A, B, C]
$ java PostScript 3 2\
Initial : [A, B, C, D]\
after roll(3, 2): [A, C, D, B]
$ java PostScript 2 4\
Initial : [A, B, C, D]\
after roll(2, 4): [A, B, C, D]
应用 roll(n,k) 的效果是将堆栈的顶部 n 个元素旋转 k 个位置,其中旋转的一般方向是朝向堆栈的顶部。更具体地说,roll(n,k) 具有移除顶部 n 个元素的效果,将顶部元素循环到最后一个位置 k 次,然后替换堆栈中重新排序的元素。例如,
滚动(4,1) 滚动(3,2) 滚动(2,4)
| D | |丙 | | D | |乙 | | D | | D |
|丙 | |乙 | |丙 | | D | |丙 | | C |
|乙 | -> |一个 | |乙 | -> |丙 | |乙 | -> | B |
|一个 | | D | |一个 | |一个 | |一个 | | |
看来我明白了。这是我的代码,以防将来有人想要这个。 导入 java.util.Stack; 导入 java.util.ArrayList;
public class PostScript {
public static void main(String [] args){
int n = Integer.parseInt(args[0]);
int k = Integer.parseInt(args[1]);
Stack<String> s = new Stack<String>();
s.push("A"); s.push("B"); s.push("C"); s.push("D");
System.out.println("Initial : " + s);
roll(s,n,k);
System.out.println("after roll(" + n + ", " + k + "): " + s);
}
public static void roll(Stack<String> stack, int n, int k){
if(n < 0 || k < 0 || n > stack.size()) throw new IllegalArgumentException("argument of of range");
ArrayList<String> arr = new ArrayList<String>(n);
for(int i = 0; i < n ; i++) arr.add(stack.pop());
int track = 0;
for(int i = 1; i < k; i++){
track++;
if(track == n) track = 0;
}
for(int i = 0; i < n; i++){
stack.push(arr.get(track--));
if(track < 0) track = n - 1;
}
}
}