繁体   English   中英

在堆栈Java中插入队列的元素

[英]Insert elements of a Queue in a Stack java

我正在练习,这是文本:函数将队列Q,空堆栈S和整数k作为输入,并在S中插入Q的前k个元素,以便Q前面的元素位于S的顶部和Q的第k个元素在S的底部。例如,如果Q = <6,8,7,15,20,9>,其中6是前面的元素,则之后调用insert(Q,S,4),我们得到S = <6,8,7,15>,其中6是顶部的元素。 我不能使用任何数据结构。 这是我的解决方案,但无法正常工作,我以错误的顺序插入元素...

public static void main(String[] args) {

    Queue<String>Q=new ArrayQueue<String>();
    Stack<String>S=new ArrayStack<String>();
    Q.enqueue("Bob");
    Q.enqueue("Tom");
    Q.enqueue("Ann");
    Q.enqueue("Bill");
    Q.enqueue("David");
    Q.enqueue("Mary");
    Q.enqueue("Bob");
    Q.enqueue("Jane");*/

    for(int k=1;k<=9;k++){
      insert(Q,S,k);
      System.out.print("Dopo aver invocato insert con k="+k +", S = < ");
      while(!S.isEmpty())
         System.out.print(S.pop()+" ");
      System.out.println(">");
    }
}

public static <E>void  insert(Queue<E> Q,Stack<E> S, int k){
        int sizeOfQ=Q.size();
        if(sizeOfQ<k)
            return;
        for(int i=0;i<k;i++){
            E elt=Q.dequeue();
            Q.enqueue(elt);
        }
        for(int i=0;i<sizeOfQ;i++){
            E elt=Q.dequeue();
            if(i>=sizeOfQ-k){
                S.push(elt);
                Q.enqueue(elt);
            }else{
                Q.enqueue(elt);
            }
        }
        for(int i=0;i<sizeOfQ-k;i++){
            Q.enqueue(Q.dequeue());
        }

显然,这是一种考试,所以我不能直接给您答案。

我能做的就是向您显示找到解决方案的方向。


尝试用其他形式写问题:

  • 如果k为0,则返回一个空堆栈
  • 如果k为1,则返回带有队列第一个元素的堆栈
  • 如果k为2并且队列前面的元素为A,并且B返回一个堆栈,其中B在底部,A在顶部,因此您需要插入第一个B,第二个A
  • 如果k为45,并且队列前面的元素是A,则需要插入A,然后以相反的顺序插入其他44个元素

以这种形式编写的它接缝了一个递归算法。 是不是

如果可以使用递归,则此问题非常简单。

仅注意两点:

  • 您的队列Q会怎样? 有可能改变吗? 还是在流程结束时需要原始Q?
  • 如果k大于Q的大小会怎样? 返回异常? 返回Q的所有元素的堆栈

如果无法递归,则需要插入一个新的数据结构(列表,数组或另一个堆栈,在这种情况下,任何可能性都可以正常工作)以维护中间步骤。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM