栈和队列的转换

目录

一、栈转队列

1、定义队列

2、放入元素

3、判断队列是否为空

4、队列的第一个元素

5、队列第一个元素的值

6、方法使用

二、队列转栈

1、定义栈

2、判断栈是否为空

3、放入元素

4、栈顶元素

5、栈顶元素的值

6、方法使用


一、栈转队列

   定义两个栈,一个栈(s1)存放要放入的元素,然后将存放的元素放入另一个栈(s2)中,因为栈是先进后出,所以两个栈的排列顺序相反,队列是先进的先出,所以s2元素的出栈顺序和栈顶元素和队列相同,所以对s2进行操作就可以实现一个队列。

1、定义队列

用两个栈来实现队列

public class MyQueue {


    private Stack<Integer> s1;


    private Stack<Integer> s2;


    public MyQueue() {

        s1 = new Stack<>();

        s2 = new Stack<>();

    }

2、放入元素

先将元素放入s1中

 public void push(int x){

        s1.push(x);

    }

3、判断队列是否为空

队列是否为空就是判断两个栈是否为空

public boolean empty(){

        return s1.empty()&&s2.empty();

    }

4、队列的第一个元素

  队列是先进先出,栈是先进后出,将s1的元素从栈顶依次放入s2中,s2的排列顺序和队列相同,队列的第一个元素就是s2的栈顶元素,将栈顶元素取出。

 public int pop(){

        if (empty()){

            return -1;

        }if (s2.empty()){

            while (!s1.empty()){

                s2.push(s1.pop());

            }

        }

        return s2.pop();

    }

5、队列第一个元素的值

队列第一个元素的值,就是s2的栈顶元素的值,不需要将栈顶元素从栈中取出。

 public int peek(){

        if (empty()){

            return -1;

        }if (s2.empty()){

            while (!s1.empty()){

                s2.push(s1.pop());

            }

        }

        return s2.peek();

    }

}

6、方法使用

定义一个Main类,对定义的方法进行使用。

public class Test {

    public static void main(String[] args) {


        MyQueue myQueue=new MyQueue();


        myQueue.push(1);


        myQueue.push(2);


        myQueue.push(3);


        myQueue.push(4);


        myQueue.push(5);


        myQueue.push(6);


        System.out.println(myQueue.empty());


        System.out.println(myQueue.pop());


        System.out.println(myQueue.peek());


    }

}

执行结果:

false
1
2


二、队列转栈

   定义两个队列(qu1 qu2)来实现栈,先将值先放入qu1中,之后哪个栈不为空放入哪个栈中。因为栈是先进后出,队列是先进先出,所以同样的元素放入栈和队列中,栈的栈顶元素就是队列的最后一个元素。将最后一个元素在前的元素放入另一个队列中,最后一个元素就来到了队列的第一个元素,可以直接取出,就取出了栈的栈顶元素。

1、定义栈

用两个队列来实现栈

public class MyStack {


    private Queue<Integer>queue1;


    private Queue<Integer>queue2;


    public MyStack() {

        queue1 = new LinkedList<>();

        queue2 = new LinkedList<>();

    }

2、判断栈是否为空

判断栈是否为空就是判断两个队列是否为空

public boolean empty(){

        return queue1.isEmpty() && queue2.isEmpty();

    }

3、放入元素

     在取栈顶元素时,两个队列中的元素要相互放入,所以哪个队列不为空,放入哪个队列中,当两个队列都为空,放入第一个队列中。

 public void push(int x){

        if (!queue1.isEmpty()){

            queue1.offer(x);

        }else if (!queue2.isEmpty()){

            queue2.offer(x);

        }

        queue1.offer(x);

    }

4、栈顶元素

栈和队列的放入顺序相反,队列的最后一个元素就是栈顶元素

public int pop(){

        if (empty()){

            return -1;

        }else if (!queue1.isEmpty()){

            int size=queue1.size();

            for (int i = 0; i < size-1; i++) {

                int a= queue1.poll();

                queue2.offer(a);

            }

            return queue1.poll();

        }else {

            int size=queue2.size();

            for (int i = 0; i < size-1; i++) {

                int a=queue2.poll();

                queue1.offer(a);

            }

            return queue2.poll();

        }

    }

5、栈顶元素的值

将队列中的元素都放入另一个队列中,用x来记录最后一个元素的值,就是栈顶元素的值。

public int peek(){

        if (empty()){

            return -1;

        }else if (!queue1.isEmpty()){

            int size=queue1.size();

            int x=-1;

            for (int i = 0; i < size; i++) {

                x= queue1.poll();

                queue2.offer(x);

            }

            return x;

        }else {

            int size=queue2.size();

            int x=-1;

            for (int i = 0; i < size-1; i++) {

                x=queue2.poll();

                queue1.offer(x);

            }

            return x;

        }

    }

}

6、方法使用

定义一个Main类来对定义的方法进行实现

public class Main {

    public static void main(String[] args) {

        MyStack myStack=new MyStack();



        myStack.push(1);


        myStack.push(2);


        myStack.push(3);


        myStack.push(4);


        myStack.push(5);


        myStack.push(6);



        System.out.println(myStack.empty());


        System.out.println(myStack.pop());


        System.out.println(myStack.peek());

    }

}

执行结果:

false
6
5


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值