0

我有一些代码只使用另一个堆栈对堆栈进行排序(这是一个面试问题)。代码本身似乎有效。我想使用泛型来实现它,以便在以下条件下任何类型的堆栈都是可排序的:

  1. 排序方法保持静态(我想避免参数化整个类)
  2. 我可以使用本机比较器运算符(如 <) - 我猜参数化类型需要实现Comparable

这可能吗?

这是代码。

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);
    }
}
4

2 回答 2

3

提到 Comparable,您就走在了正确的道路上。

你的方法可以

static <T extends Comparable<T>>void sort(Stack<T> stack) {

并且比较 curr < stack.peek() 替换为

curr.compareTo(stack.peek()) < 0
于 2013-08-12T11:59:20.200 回答
2

在 Java 中不可能在对象(包装的原语或不包装的原语)上使用比较器运算符。C++ 支持这种可能性。但是,您可以通过强制参数类型实现 Comparable 来创建解决方法。您的签名应如下所示:

public <T extends Comparable<? super T>> static void sort(Stack<T> stack)

并且为了比较,使用compareTo而不是本地运算符(这在 Java 中是不可能的):

obj1.compareTo(obj2)
于 2013-08-12T11:54:30.970 回答