代码随想录 day10

了解队列和栈

栈的基本操作:

Stack stackIn=new Stack<>();

判断是否为空 isEmpty();
把元素压栈:push(E);
把栈顶的元素“弹出”:pop();
取栈顶元素但不弹出:peek()。
是否存在: search(O)

队列的基本操作

Deque deque=new ArrayDeque<>();

增加一个元索:				add           如果队列已满,则抛出一个IIIegaISlabEepeplian异常
添加一个元素并返回true   offer           
移除并返回队列头部的元素  remove      
返回队列头部的元素    	element            
移除并返问队列头部的元素   poll           
返回队列头部的元素  		 peek                  

Deque是接口所能代表的数据结构:队列,双端队列,堆栈。

之前老是把deque和Queue搞混,

这里显示下其结构

image-20230224140819562

ArrayDeque实现了双端队列,可以两端添加、删除元素

用栈实现队列

使用栈实现队列的下列操作:

push(x) – 将一个元素放入队列的尾部。
pop() – 从队列首部移除元素。
peek() – 返回队列首部的元素。
empty() – 返回队列是否为空

用栈实现队列

思路

这里是用两个栈来是实现,一个in,一个out

添加的时候,添加到in里面(后续out里面有值也一样)

然后出来的时候,如果out里面没有 ,in先全部加到out里面,再出来

下面用具体案例来展示

image-20230224143949688

代码

class MyQueue {
    Stack<Integer> stackIn;
    Stack<Integer> stackOut;

    public MyQueue() {
        stackIn=new Stack<>();
        stackOut=new Stack<>();

    }

    /**
     *  将元素 x 推到队列的末尾
     * @param x
     */
    public void push(int x) {
        stackIn.push(x);
    }

    /**
     * 从队列的开头移除并返回元素
     * @return
     */
    public int pop() {
        if (stackOut.empty()){
           while (!stackIn.empty()){
               stackOut.push(stackIn.pop());
           }
        }
        return stackOut.pop();
    }

    /**
     * 返回队列开头的元素
     * @return
     */
    public int peek() {
        if (stackOut.empty()){
            while (!stackIn.empty()){
                stackOut.push(stackIn.pop());
            }
        }
        return stackOut.peek();
    }

    /**
     * 如果队列为空,返回 true ;否则,返回 false
     * @return
     */
    public boolean empty() {
        return stackOut.empty()&&stackIn.empty();
    }

用队列实现栈

使用队列实现栈的下列操作:

  • push(x) – 元素 x 入栈
  • pop() – 移除栈顶元素
  • top() – 获取栈顶元素
  • empty() – 返回栈是否为空

用队列实现栈

思路

这里用一个队列来模拟栈

添加一个元素之后,将这个元素的前面的元素挨个移出来,加入到队列后面

这个调整队列次数是 size-1,也就是把 size-1 个元素移到后面去

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pvsK2nVt-1677221621821)(C:\Users\14133\AppData\Roaming\Typora\typora-user-images\image-20230224142949263.png)]

代码

class MyStack {
    Deque<Integer> deque;
    public MyStack() {
        deque=new ArrayDeque<>();
    }

    /**
     * 将元素 x 压入栈顶。
     * @param x
     */
    public void push(int x) {
        deque.offer(x);
        int size=deque.size();
        while (size-->1){
            deque.offer(deque.pollFirst());
        }
    }

    /**
     * 移除并返回栈顶元素。
     * @return
     */
    public int pop() {
        return deque.poll();
    }

    /**
     * 返回栈顶元素。
     * @return
     */
    public int top() {
        return deque.peek();
    }

    /**
     * 如果栈是空的,返回 true ;否则,返回 false 。
     * @return
     */
    public boolean empty() {
        return deque.isEmpty();
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值