龙空技术网

每日分享- 如何用顺序队列实现栈的逆置

理工男二号 40

前言:

此刻你们对“c语言实现顺序栈的基本操作”大约比较注重,姐妹们都需要分析一些“c语言实现顺序栈的基本操作”的相关内容。那么小编同时在网络上收集了一些对于“c语言实现顺序栈的基本操作””的相关资讯,希望看官们能喜欢,小伙伴们一起来学习一下吧!

用顺序队列实现栈的逆置的方法是,先将栈中的所有元素依次出栈,并依次放入队列中,最后再将队列中的元素依次出队并压入栈中即可。

以下是一个使用两个顺序队列实现栈逆置的例子:

public class StackReverse<T> {    private final Queue<T> queue1;    private final Queue<T> queue2;    public StackReverse() {        queue1 = new LinkedList<>();        queue2 = new LinkedList<>();    }    public void push(T item) {        queue1.offer(item);    }    public T pop() {        if (queue1.isEmpty()) {            throw new NoSuchElementException("Stack is empty");        }        while (queue1.size() > 1) {            queue2.offer(queue1.poll());        }        T item = queue1.poll();        Queue<T> temp = queue1;        queue1 = queue2;        queue2 = temp;        return item;    }    public boolean isEmpty() {        return queue1.isEmpty();    }    public static void main(String[] args) {        StackReverse<Integer> stack = new StackReverse<>();        stack.push(1);        stack.push(2);        stack.push(3);        while (!stack.isEmpty()) {            System.out.println(stack.pop());        }    }}

在上面的例子中,当需要出栈时,我们将栈中的元素依次放入 queue2 中,直到栈中只剩下一个元素。然后我们交换 queue1queue2,这样栈中的最后一个元素就成为了队列中的第一个元素,我们将其出队并返回即可。这种方法的时间复杂度为 O(n)。

另一种比较复杂的实现方式是使用一个顺序队列和一个栈,具体实现方式可以参考下面的代码:

public class StackReverse<T> {    private final Queue<T> queue;    private final Stack<T> stack;    public StackReverse() {        queue = new LinkedList<>();        stack = new Stack<>();    }    public void push(T item) {        queue.offer(item);    }    public T pop() {        if (queue.isEmpty() && stack.isEmpty()) {            throw new NoSuchElementException("Stack is empty");        }        if (stack.isEmpty()) {            while (!queue.isEmpty()) {                stack.push(queue.poll());            }        }        return stack.pop();    }    public boolean isEmpty() {        return queue.isEmpty() && stack.isEmpty();    }    public static void main(String[] args) {        StackReverse<Integer> stack = new StackReverse<>();        stack.push(1);        stack.push(2);        stack.push(3);        while (!stack.isEmpty()) {            System.out.println(stack.pop());        }    }}

在上面的例子中,当需要出栈时,我们先判断栈是否为空,如果为空,我们将队列中的所有元素依次弹出并压入栈中,然后再从栈中弹出一个元素并返回。这种方法的时间复杂度也为 O(n)。

标签: #c语言实现顺序栈的基本操作