数据结构 反转队列的前 K 个元素

 

例题: 

输入:10,20,30,40,50,60,70,80,90,100和k=5

输出:50,40,30,20,10,60,70,80,90,100

思路:

方法1:

  • 创建一个空堆栈。
  • 从给定队列中逐个取消排队的第一个 K 个项目,并将取消排队的项目推送到堆栈。
  • 将堆栈的内容排在队列的后面
  • 从前面取消排队 (size-k) 元素,并将它们一个接一个地排队到同一个队列。

 

时间复杂度: O(N + k),其中“n”是队列中的元素总数,“k”是要反转的元素数。这是因为首先将整个队列清空到堆栈中,然后以相同的方式清空和排队。
辅助空间:O(k),其中 k 是要反转的元素,因为堆栈用于存储值以反转。

import java.util.LinkedList;
import java.util.Queue;
import java.util.Stack;

public class test {
    static Queue<Integer> queue;

    static void reverseQueueFirstKElements(int k)
    {
        if (queue.isEmpty() == true || k > queue.size())
            return;
        if (k <= 0)
            return;

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

        // 将前k个元素取出入栈
        for (int i = 0; i < k; i++) {
            stack.push(queue.peek());
            queue.remove();
        }

        // 将栈中的元素压入队列中,这样前k个元素已经倒序,在队列的尾部
        while (!stack.empty()) {
            queue.add(stack.peek());
            stack.pop();
        }

        // 将不需要倒序的元素按顺序添加到尾部
        for (int i = 0; i < queue.size() - k; i++) {
            queue.add(queue.peek());
            queue.remove();
//            queue.add(queue.remove());
        }
    }

    
    static void Print()
    {
        while (!queue.isEmpty()) {
            System.out.print(queue.peek() + " ");
            queue.remove();
        }
    }

    // Driver code
    public static void main(String args[])
    {
        queue = new LinkedList<Integer>();
        queue.add(10);
        queue.add(20);
        queue.add(30);
        queue.add(40);
        queue.add(50);
        queue.add(60);
        queue.add(70);
        queue.add(80);
        queue.add(90);
        queue.add(100);

        int k = 5;
        reverseQueueFirstKElements(k);
        Print();
    }
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值