0

如何制作堆栈的副本,​​但仅使用Stack 类中的pushpoppeekisEmpty方法保留原始堆栈?这甚至可能吗?

public static <E> Stack<E> copy(Stack<E> s){

        s2 = new Stack<E>();
        if(s.isEmpty())
            return null;

        while(!s.isEmpty())
        {
            E elem = s.peek();
            s2.push(elem);
            s.pop();
        }

        return s2;
    }

    public static void main(String[] args) {

        StackCopy sCopy = new StackCopy();

        Stack<Integer> s = new Stack<Integer>();

        s.push(1);
        s.push(2);
        s.push(3);
        s.push(4);
        s.push(5);

        s2 = sCopy.copy(s);

                System.out.print("stack1 = ");
                while(!s.isEmpty()){
            System.out.print(s.peek() );
            s.pop();
        }       

                System.out.println("Stack 2 = ");
        while(!s2.isEmpty()){
            System.out.print(s2.peek() );
            s2.pop();
        }


    }
4

1 回答 1

0

你要做的就是一直弹出到底部并偷看它,以某种方式存储每个弹出的值(到动态分配的数组中?)(Java中的ArrayList?)

然后,您必须将值推回堆栈并复制到另一个堆栈。

堆栈通常并不意味着被复制为数据结构。

如果您有选择并且想要该功能,则可以考虑使用另一种数据结构,例如双端队列。

使用双端队列,您只需从顶部取下并复制到新顶部,然后将其放回底部,然后遍历所有项目一次。

http://docs.oracle.com/javase/7/docs/api/java/util/Deque.html

http://www.cplusplus.com/reference/deque/deque/

于 2013-11-07T00:40:35.230 回答