栈与队列的互相实现

时间:2021-03-13 17:39:49

1、问题描述:栈是先入后出的数据结构,而队列是先入先出的数据结构,要求用两个数据栈实现数据的先入先出,即队列。

在数据栈的包内实现:

public class StackToQueue{

    public static  void entryQueue(Stack s1, int val){
        // s1保存数据
        s1.push(val);
    }

    public static  int popQueue(Stack s1, Stack s2){
        int num = -1;
        if (s2.isEmpty()){
            // 把s1栈顶的值依次出栈到s2
            while (!s1.isEmpty()){
                num = s1.getTop();
                s2.push(num);
                // s1栈顶元素的变化
                s1.pop();
            }
        }
        int num2 = -1;
        // s1全部出栈后取s2的栈顶元素,就是队列的头
        if (!s2.isEmpty()){
            num2 = s2.getTop();
            s2.pop();
        }else{
            System.out.println("出队完毕");
        }
        return num2;
    }
    public static void main(String[] args) {
        Stack  s1 = new Stack();
        Stack  s2 = new Stack();
        entryQueue(s1,10);
        entryQueue(s1,20);
        entryQueue(s1,120);
        s1.printf();
        System.out.println("队列头是" + popQueue(s1,s2));
        System.out.print("出队后的数据是: ");
        s2.printf();
    }
}

输出结果是:

        10 20 120 
        队列头是10
        出队后的数据是: 120 20 


2、问题描述:要求用两个队列实现先入后出功能,即栈。

在数据栈的包内实现:

public class QueueToStack {
    public static void enter(Queue q1, Queue q2, int data) {
         Queue p = null;
        // 用队列q2来保存元素
        if (!q1.isEmpty()) {
            p = q1;
        }else {
            p = q2;
        }
        p.push(data);
    }


    public static int popStack(Queue q1, Queue q2) {

        Queue p1 = null;
        Queue p2 = null;
        if (!q1.isEmpty()) {
            // p1指向非空队列q2
            p1 = q1;
            // p2用来接收q2出队的元素
            p2 = q2;
        }else {
            p1 = q2;
            p2 = q1;
        }
        int num = 0;
        if (!p1.isEmpty()) {
            // 把p1中除了队尾的元素全部出队到p2
            while(p1.usedSize > 1) {
                num = p1.pop();
                p2.push(num);
            }
            // p1的队尾元素就是栈顶元素
            return p1.getTop();
        }
        return -1;
    }

    public static void main(String[] args){
        Queue link1 = new Queue();
        Queue link2 = new Queue();
        enter(link1,link2,1);
        enter(link1,link2,2);
        enter(link1,link2,3);
        link2.print();
        System.out.println("出栈的元素是 :" + popStack(link1,link2));
        link1.print();
    }
}

结果是:

        1 2 3 
        出栈的元素是 :3
        1 2