数据结构基础——栈和队列

本文介绍了数据结构中的栈和队列的基本概念、实现方式以及它们在现实生活中的应用。栈遵循先进后出的原则,常用于撤销操作、操作系统栈等;队列则遵循先进先出原则,常见于各种排队场景。文中还讨论了栈和队列的数组和链表实现,以及循环队列、双端队列的概念。最后,通过经典题目展示了如何用栈和队列实现特定功能,如最小栈、用队列实现栈、用栈实现队列。
摘要由CSDN通过智能技术生成

栈和队列

栈和队列其实是操作受限的线性表。

数组、链表既可以头部插入删除,也可以尾部插入删除,也可以在任意位置插入删除。

栈和队列只能在一段插入删除元素。

一、栈(水杯型)

1.栈的概念

只能从一端插入元素,也只能从一端去除元素(栈顶)

先进后出,后进先出。从栈中取出的顺序和从栈中添加的元素顺序相反。

栈在现实生活中:

①无处不在的undo(撤销)操作(返回上一级);

②操作系统栈

2.栈的实现

基于数组实现的栈–>顺序栈

基于链表实现的栈–>链式栈

  1. push(E e):向栈中添加元素–>入栈,压栈
  2. E pop():出栈操作,弹出栈顶元素
  3. E peek():查看栈顶元素,但不出栈
import java.util.ArrayList;
import java.util.List;
import java.util.NoSuchElementException;

/**
 * 基于动态数组实现的栈
 */
public class MyStack<E> {
   
    //记录元素个数
    private int size;
    //实际存储的动态数组
    private List<E> data = new ArrayList<>();

    /**
     * 向当前栈中添加元素-->压栈操作
     */
    public void push(E val) {
   
        //数组尾部插入元素
        data.add(val);
        size++;
    }

    /**
     * 出栈操作,弹出栈顶元素
     */
    public E pop() {
   
        if (data.isEmpty()) {
   
            throw new NoSuchElementException("stack is empty! can not pop!");
        }
        E val = data.remove(size - 1);
        size--;
        return val;
    }

    /**
     * 查看栈顶元素,不弹出
     */
    public E peek() {
   
        if (data.isEmpty()) {
   
            throw new NoSuchElementException("stack is empty! can not peek!");
        }
        return data.get(size - 1);
    }

    @Override
    public String toString() {
   
        StringBuffer sb = new StringBuffer();
        sb.append("[");
        for (int i = 0; i < size; i++) {
   
            sb.append(data.get(i));
            if (i != size - 1) {
   
                sb.append(",");
            }
        }
        sb.append("] top");
        return sb.toString();
    }
}

二、队列

栈和队列是一码事,都是对只能在线性表的一端进行插入和删除,因此,栈和队列其实可以相互转换。

1.队列的概念

队列(FIFO):先进先出的数据结构,元素从“队尾”添加,从“队首”出队。

队列在现实生活中:各式各样的“排队”操作

2.队列的实现

基于数组实现的队列–>顺序队列

基于链表实现的队列–>链式队列

(1)普通队列

链式队列更加适合队列的结构,出队列删除头结点,添加元素在链表尾部添加即可。

  1. offer(E val):入队列;
  2. peek():查看队列;
  3. poll():弹出队的首元素

相对于栈来说,队列实现的子类是比较多的,建立一个Queue接口:

public interface Queue<E> {
   
    //入队操作
    void offer(E val);
    //出队操作
    E poll();
    //查看队首元素
    E peek();
    boolean isEmpty();
}

普通队列:

/**
 * 基于链表实现的普通队列
 */

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值