用两个栈实现一个队列&用两个队列实现一个栈

1、思路

用两个栈实现一个队列&用两个队列实现一个栈

a.区别和联系

相同点:(1)栈和队列都是控制访问点的线性表;

              (2)栈和队列都是允许在端点处进行数据的插入和删除的数据结构;

不同点:(1)栈遵循“后进先出(LIFO)”的原则,即只能在该线性表的一头进行数据的插入和删除,该位置称为“栈顶”,而另外一头称为“栈底”;根据该特性,实现栈时用顺序表比较好;

              (2)队列遵循“先进先出(FIFO)”的原则,即只能在队列的尾部插入元素,头部删除元素。根据该特性,在实现队列时用链表比较好;

b.应用场景

栈:括号匹配;用于计算后缀表达式,等数据结构中

队列:应用于类似现实生活中一些排队问题,例如Linux中我们学习进程间通信的时候,有一种通信方式就是“消息队列”等。
问题一:用两个栈实现一个队列
用两个栈实现一个队列是指,我们要实现队列的“尾插”和“头删”操作。

首先,假如我们要插入一些数据“abcd”,我们知道按照这个顺序队列出现的结果也是“abcd”,而栈会出现“dcba”,刚好相反,因此将该栈的到的数据在插入另外一个栈中就会出现我们想要的结果。因此,我们定义两个栈为“stack1”和“stack2”,栈1只用来插入数据,栈2用来删除数据栈1插入进来的数据。
我们必须规定当stack2中的元素pop完之后,也就是satck2为空时,再插入stack1中的元素。

2、实现代码

import java.util.Arrays;
import java.util.EmptyStackException;
import java.util.Stack;

class Mystack<T> {
    private T[] element;
    private int top;

    public Mystack() {
        element = (T[]) new Object[10];
    }

    public void push(T value) {
        if (top == element.length) {
            element = Arrays.copyOf(element, element.length << 1);
        }
        element[element.length - 1 - top] = value;
        top++;
    }

    public void pop() {
        if (top == 0) {
            return;
        }
        element[--top] = null;
    }

    public T peek() {
        if (top == 0) {
            throw new EmptyStackException();
        }
        return element[top - 1];
    }
}
public class TestDemo<T>{
    public static <T> void twoStackToOneQueue(T[] arr, Stack<T>st1,Stack<T>st2){
        for (int i=0;i<arr.length;i++){
            st1.push(arr[i]);
        }
        while (!st1.isEmpty()){
            st2.push(st1.peek());
            st1.pop();
        }
        while (!st2.isEmpty()){
            System.out.print(st2.peek()+" ");
            st2.pop();
        }
    }

    public static void main(String[] args) {
        Stack<Integer> st=new Stack<>();
        //st.peek();
        Integer[] arr={1,2,3,4,5};
        twoStackToOneQueue(arr,new Stack<>(),new Stack<>());
    }
}

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值