队列和栈-(基础理解+实战)

1.首先理解一下他们的概念和区别

栈(Last In Last Out)是一种后进先出的数据结构,元素从顶端入栈,然后从顶端出栈。

队列 (First In Last Out)是一种先进先出的数据结构,元素从后端入队,然后从前端出队。

用图片来表示就是

队列和栈-(基础理解+实战)_第1张图片

 队列

队列和栈-(基础理解+实战)_第2张图片

 2.接下来介绍一下栈和队列的一些常用方法

push(x) 将元素x压入栈顶
pop() 返回并删除栈顶元素
peek() 返回栈顶元素但是不删除
isEmpty() 判断栈是否为空

用图片来表示一下(push和pop方法)

队列和栈-(基础理解+实战)_第3张图片

 同样列出队列的常用方法

offer() 向队列中添加元素
poll() 移除并获取队首位元素
peek() 获取队首元素
isEmpry() 判断队列是否为空

3.接下来引入leetcode 中的第225和第232题来进行实战

队列和栈-(基础理解+实战)_第4张图片

接下来用两个队列来实现一个栈的操作 来解题,由此可以对比出栈和队列的方法区别。

class MyStack {
    Queuequeue1;
     Queuequeue2;

    public MyStack() {
    queue1=new LinkedList();
    queue2=new LinkedList();
    }

    //操作1:将元素x压入栈顶
    public void push(int x) {
    queue2.offer(x);//offer在队列的尾部插入元素

    while(!queue1.isEmpty())//isEmpty判断链表是否为空  
    queue2.offer(queue1.poll());//poll获取元素并且删除
     Queuetemp=queue1;
    queue1=queue2;
    queue2=temp;

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

    //返回栈顶元素
    public int top() {
    return queue1.peek();//peek找到但是不移除此列表的头部
    }
    //如果栈是空的,返回true
    public boolean empty() {
     return queue1.isEmpty();
    }
}

/**
 * Your MyStack object will be instantiated and called as such:
 * MyStack obj = new MyStack();
 * obj.push(x);
 * int param_2 = obj.pop();
 * int param_3 = obj.top();
 * boolean param_4 = obj.empty();
 */

第232题 

队列和栈-(基础理解+实战)_第5张图片

 接下来用两个栈,一个输入栈,一个输出栈来解题:

class MyQueue {
    //创建两个栈,一个输入栈,一个输出栈
    DequeinStack;
    DequeoutStack;
    public MyQueue() {
    inStack=new ArrayDeque();
    outStack=new ArrayDeque();
    }
    
    public void push(int x) {
      inStack.push(x);
    }
    
    public int pop() {
     if(outStack.isEmpty())
     in2out();
     return outStack.pop();
    }
    
    public int peek() {
    if(outStack.isEmpty())
    in2out();
    return outStack.peek();
    }
    
    public boolean empty() {
      return inStack.isEmpty()&&outStack.isEmpty();
    }
    private void in2out(){
        while(!inStack.isEmpty())
        outStack.push(inStack.pop());
    }
}

/**
 * Your MyQueue object will be instantiated and called as such:
 * MyQueue obj = new MyQueue();
 * obj.push(x);
 * int param_2 = obj.pop();
 * int param_3 = obj.peek();
 * boolean param_4 = obj.empty();
 */

感兴趣的话可以再找一些题练练手。

欢迎在评论区留言指正错误,我们一起进步!

你可能感兴趣的:(数据结构与算法,数据结构)