栈和队列的“转换”

    xiaoxiao2021-03-25  116

    今天在复习数据结构时候,看到栈和队列这一章,有两个很有意思的问题, 1 如何使用两个栈来实现一个队列 2 如何使用两个队列来实现一个栈 思想都比较简单,简而言之就是两边儿来回倒 附两张图即可说明

    接下来 记录一下这两个功能的java代码实现 首先是两个栈 实现一个队列

    package learnstack; import java.util.Stack; /* * 本程序计划使用两个栈来实现一个队列 栈 先进后出 队列先进先出 怎么结合两个栈呢? 压进去弹到另一个栈中就好 */ public class test { Stack<Integer> stack1=new Stack <Integer>(); Stack<Integer> stack2=new Stack <Integer>(); public void push(int node){ stack1.push(node); } public int pop(){ if(stack2.size()<=0){ while(stack1.size()>0){ stack2.push(stack1.pop()); } } if(stack2.isEmpty()){ try{ throw new Exception("queue is empty"); }catch (Exception e){ } } int head =stack2.pop(); return head; } public static void main(String[] args){ test test1=new test(); test1.push(0); test1.push(1); test1.push(2); System.out.println(test1.pop()); System.out.println(test1.pop()); System.out.println(test1.pop()); } }

    在程序中压入0 1 2 输出结果自然是0 1 2咯

    接着来记录一下两个队列实现一个栈

    package learnstack; import java.util.Queue; import java.util.ArrayDeque; /* * 本程序使用两个队列实现一个栈 队列先进先出 栈后进先出 左右队列来回倒 */ public class test2 { Queue<Integer> queue1= new ArrayDeque<>(); Queue<Integer> queue2= new ArrayDeque<>(); public void push(int node){ if(queue1.isEmpty()&&queue2.isEmpty()){ queue1.add(node); return; } if(queue1.isEmpty()){ queue2.add(node); return; } if(queue2.isEmpty()){ queue1.add(node); return; } } public int pop(){ if (queue1.isEmpty()&&queue2.isEmpty()) { try { throw new Exception("stack is empty"); } catch (Exception e) { } } if(queue1.isEmpty()){ while(queue2.size()>1){ queue1.add(queue2.poll()); } return queue2.poll(); } if(queue2.isEmpty()){ while(queue1.size()>1){ queue2.add(queue1.poll()); } return queue1.poll(); } return (Integer)null; } public static void main(String[] args){ test2 t2=new test2(); t2.push(1); t2.push(2); t2.push(3); t2.push(4); System.out.println(t2.pop()); System.out.println(t2.pop()); } }

    压入的参数是1 2 3 4 显示两个结果 则 输出结果为 4 3 后进先出嘛!

    转载请注明原文地址: https://ju.6miu.com/read-13273.html

    最新回复(0)