📜  门| GATE-CS-2005 |第 58 题(1)

📅  最后修改于: 2023-12-03 15:12:41.088000             🧑  作者: Mango

题目介绍

这道题目来自于GATE-CS-2005考试,考察的是程序员对于数据结构的掌握程度。题目难度适中,理解清楚题意即可完成。

题目内容

以下是题目的具体描述:

用两个栈实现队列,通过这两个栈实现对于队列的入队和出队操作。

栈的实现可以使用链表或者顺序存储。

要求实现两个函数:

void enQueue(int x):将元素x入队。
int deQueue():在队列不为空的情况下,将队首元素移除并返回。如果队列为空,返回-1。
思路分析

我们可以分析一下这个题目:

  1. 根据队列先进先出的特点,我们需要把数据按顺序入队,也就是从第一个元素开始,依次往后排列。
  2. 每次入队都是在队尾插入,而出队则是从队首开始移除。
  3. 我们可以用两个栈来实现队列的入队和出队操作。
  4. 栈的特点是先进后出,我们用其中一个栈来实现队列入队操作,把所有元素都顺序插入。当需要进行出队操作时,我们用另一个栈来实现,把第一个栈的元素依次弹出并倒入另一个栈中,这样就能满足队列先进先出的特点了。

下面是具体的代码实现。

代码实现

我们可以用两个栈来实现以上思路分析的操作。

import java.util.Stack;

public class QueueUsingStacks {

    Stack<Integer> stack1 = new Stack<Integer>();
    Stack<Integer> stack2 = new Stack<Integer>();

    public void enQueue(int x) {
        // 把元素按顺序插入到stack1中
        stack1.push(x);
    }

    public int deQueue() {
        // 如果stack2不为空,直接从中弹出元素
        if (!stack2.isEmpty())
            return stack2.pop();
        // 如果stack1为空,表示队列中没有元素
        if (stack1.isEmpty())
            return -1;
        // 把stack1中的所有元素倒入stack2中,实现队列先进先出
        while (!stack1.isEmpty())
            stack2.push(stack1.pop());
        return stack2.pop();
    }

    public static void main(String[] args) {

        QueueUsingStacks queue = new QueueUsingStacks();

        queue.enQueue(1);
        queue.enQueue(2);
        queue.enQueue(3);
        queue.enQueue(4);

        System.out.println(queue.deQueue());
        System.out.println(queue.deQueue());

        queue.enQueue(5);

        System.out.println(queue.deQueue());

    }

}
结语

通过以上实现,我们成功的用两个栈实现了队列操作,解决了队列先进先出的特点。这道题目考察了我们对于数据结构的掌握程度,也提高了我们对于栈和队列的理解。