我有一些代码只使用另一个堆栈对堆栈进行排序(这是一个面试问题)。代码本身似乎有效。我想使用泛型实现它,以便在以下条件下任何类型的堆栈都是可排序的:
这可能吗?
这是代码。
import java.util.Stack;
public class StackSort {
static void sort(Stack<Integer> stack) {
Stack<Integer> tmp = new Stack<Integer>();
for (;;) {
int nswaps = 0;
while (!stack.isEmpty()) {
Integer curr = stack.pop();
if (!stack.isEmpty() && curr < stack.peek()) {
Integer next = stack.pop();
tmp.push(next);
tmp.push(curr);
++nswaps;
} else {
tmp.push(curr);
}
}
while (!tmp.isEmpty()) {
stack.push(tmp.pop());
}
if (nswaps == 0) {
break;
}
}
}
public static void main(String[] args) {
Stack<Integer> stack = new Stack<Integer>();
stack.push(6);
stack.push(4);
stack.push(11);
stack.push(8);
stack.push(7);
stack.push(3);
stack.push(5);
System.out.println(stack);
StackSort.sort(stack);
System.out.println(stack);
}
}
答案 0 :(得分:3)
通过提及可比较,你是正确的。
您的方法可以
static <T extends Comparable<T>>void sort(Stack<T> stack) {
比较曲线&lt; stack.peek()替换为
curr.compareTo(stack.peek()) < 0
答案 1 :(得分:2)
在Java中不可能在Objects上使用比较器运算符(包括或不包装原语)。 C ++支持这种可能性。但是,您可以通过强制参数类型实现Comparable来创建变通方法。您的签名应如下所示:
public <T extends Comparable<? super T>> static void sort(Stack<T> stack)
要进行比较,请使用compareTo
而不是本机运算符(这在Java中是不可能的):
obj1.compareTo(obj2)