栈、队列的链式存储结构

2023-10-27

栈:

再说链表的实现栈之前,我们先回顾一下什么是栈:
栈基本概念
(stack)是限定在表尾进行插入和删除操作的线性表(或单链表)。
//只能在一段进行插入和删除,因此不存在,在中间进行插入
栈顶(top):允许插入和删除的一端。而另一端称为栈底(bottom)
空栈:不含任何数据元素的栈。
后进先出

两个基本操作:
栈的插入操作(push),叫做进栈,或压栈,或入栈
删除操作(pop),叫做出栈,或弹栈
接下来具体说下用链表实现栈的思想:
首先要确定把链表的头节点作为栈顶还是为节点作为栈顶–》
上一篇文章已经写到了链表的add方法和remove方法,通过代码我们可以发现,add方法不管头插还是尾插,时间复杂度都为o(n),而remove就不一样了,当从头删的时候只需要移动指针,而从尾删除的时候需要遍历整个链表,所以我们就把链表的尾部当作栈底,头部当作栈头。
在这里插入图片描述
由于栈是特殊的线性表,只是加了一些限制,所以直接上代码:


public class LinkedStack<E> implements Stack<E> {
	
	private LinkedList<E> list ;
	
	public LinkedStack() {
		list = new LinkedList<E>();
	}
	
	@Override
	public int getSize() {
		return list.getSize();
	}

	@Override
	public boolean isEmpty() {
		return list.isEmpty();
	}

	@Override
	public void push(E e) {
		list.addFirst(e);
	}

	@Override
	public E pop() {
		return list.removeFirst();
	}

	@Override
	public E peek() {
		return list.getFirst();
	}

	@Override
	public void clear() {
		list.clear();
	}
	
	@Override
	public String toString() {
		StringBuilder sb =new StringBuilder();
		sb.append("LinkedStack: size="+getSize()+"\n");
		if(isEmpty()) {
			sb.append("[]");
		}else {
			sb.append('[');
			for(int i=0;i<getSize();i++) {
				sb.append(list.get(i));
				if(i!=getSize()-1) {
					sb.append(',');
				} else {
					sb.append(']');
				}
			}
		}
		return sb.toString();
	}
	
	@SuppressWarnings("unchecked")
	@Override
	public boolean equals(Object obj) {
		if(obj == null) {
			return false;
		}
		if(obj == this) {
			return true;
		}
		if(obj instanceof LinkedStack) {
			LinkedStack<E> stack = (LinkedStack<E>) obj;
 			return list.equals(stack.list);
		}
		return false;
	}

}

队列

我们先回顾一下队列的概念:
队列是一种特殊的线性表

队列仅能在线性表的两端进行操作

-队头(Front):取出数据元素的一端

-队尾(Rear):插入数据元素的一端

队列的特性:

-先进先出
下来我们用链表来实现一下队列这种结构:
首先我们需要确定队头和队尾的位置:
头部进行插入的时间复杂度 O(1)

在这里插入代码片头部进行删除的时间复杂度 O(1)
尾部进行插入的时间复杂度 O(1)

尾部进行删除的时间复杂度 O(n)
所以,我们在实现队列的时候最优的选的就是在尾部进行插入,头部进行删除
类图如下:
在这里插入图片描述
代码如下:

public class LinkedQueue<E> implements Queue<E> {
	
	private LinkedList<E> list;
	
	public LinkedQueue() {
		list = new LinkedList<E>();
	}

	@Override
	public int getSize() {
		return list.getSize();
	}

	@Override
	public boolean isEmpty() {
		return list.isEmpty();
	}

	@Override
	public void clear() {
		list.clear();
	}

	@Override
	public void enqueue(E e) {
		list.addLast(e);
	}

	@Override
	public E dequeue() {
		return list.removeFirst();
	}

	@Override
	public E getFront() {
		return list.getFirst();
	}

	@Override
	public E getRear() {
		return list.getLast();
	}
	
	@Override
	public String toString() {
		StringBuilder sb = new StringBuilder();
		sb.append("LinkedQueue: size="+getSize()+"\n");
		if(isEmpty()) {
			sb.append("[]");
		}else {
			sb.append('[');
			for(int i=0;i<getSize();i++) {
				sb.append(list.get(i));
				if(i!=getSize()-1) {
					sb.append(',');
				} else {
					sb.append(']');
				}
			}
		}
		return sb.toString();
	}
	
	@SuppressWarnings("unchecked")
	@Override
	public boolean equals(Object obj) {
		if(obj == null) {
			return false;
		}
		if(obj == this) {
			return true;
		}
		if(obj instanceof LinkedQueue) {
			LinkedQueue<E> stack = (LinkedQueue<E>) obj;
			return list.equals(stack.list);
		}
		return false;
	}

}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

栈、队列的链式存储结构 的相关文章

  • R及R包的安裝、更新及版本查询

    1R包的安裝 1 安裝来自CRAN的R包 install packages openxlsx 2 手动从网上搜索到下载 zip 或 tar gz 文件到本地 再手动安装 download the source file download f
  • c++基础

    1 打印三角形 求和 99乘法表 判断质数 if 0 include

随机推荐

  • 论文精读:Ansor: Generating High-Performance Tensor Programs for Deep Learning

    文章目录 1 Abstract 2 Introduction 3 Background 4 Design Overview 5 Program Sampling 5 1 Sketch Generation 5 2 Random Annota
  • 最近成了三等奖专业户

    最近连续收到三等奖证书若干 最欣慰的是蓝桥杯省赛scratch三等奖 小妞水平也就那样 她从市赛的优秀奖 四等奖 到省赛的三等奖 居然还进步了 老母亲知足了 scratch主要是因为我自己水平有限 没办法高效辅导她 有可能就止步于此 NOC
  • 数据结构期末复习题(线性表 链表)

    目录 线性表 1 用已有数组创建顺序表 2 用键盘输入的方式创建顺序表 3 输出顺序表各元素 4 在顺序表某一个位置插入一个元素 5 在顺序表某一个位置删除一个元素 6 查找顺序表上某个位置的元素并输出 7 查找顺序表上某个数的位置并输出
  • File I/O总结

    一 File类的常用方法 1 boolean exists 判断文件或目录是否存在 2 boolean isFile 判断是否是文件 3boolean isDirectory 判断是否是目录 4 String getPath 返回此对象表示
  • solidity经典案例----拍卖

    Solidity经典合约案例 拍卖 1 案例分析 2 具体的代码 pragma solidity 0 6 1 contract aution demo address payable public seller 卖方 address pay
  • 110道python面试笔试题汇总

    看到一篇python 基础面试练习题文章 有必要面试前做一下 转至 https blog csdn net weixin 40907382 article details 80621513 1 一行代码实现1 100之和 利用sum 函数求
  • Less-7(文件读写操作)

    文章目录 OUTFILE注入 实战 1 关卡分析 2 过关斩将 2 1 secure file priv 2 2 注入过程 load file的使用 SQLmap OUTFILE注入 在前面的学习中 我们知道了sql注入中的盲注和双注入是个
  • CentOS 代理 proxy设置方法

    说明 为什么说是http代理 其实这个还不能说是全称走代理 罪名写的区别就是ICMP协议这个设置就无效 只能说是90 的应用都可以使用这个设置来实现代理访问 只有个别不行 比如一些软件根本不走http协议的 那么此种方法绝对不行 下面是讲解
  • 利用VC++编程实现程序自动启动

    摘要 在工作中经常遇到一些程序 当计算机启动时会自动将该程序加载 以实现对计算机的监控等特殊的目的 本文就针对这个问题 阐述了系统加载特定程序的原理和方法 同时利用VC 6 0编程实现这种特定的功能的 并对其中的关键代码进行了分析 工作中经
  • Peewee进阶

    Part1前言 接上篇文章 如果我们想要修改表结构或者字段属性该如何操作呢 带着这个问题 今天我们就一起来了解 peewee 的进阶操作 Part2关于 playhouse peewee 有很多的扩展 这些扩展都集中收录在 playhous
  • 网线分类解析

    网线的类别分几个维度去看 1 屏蔽双绞线 STP 屏蔽双绞线 是一种特殊的网线 它比非屏蔽双绞线多一道工序 网线内部信号线的外面包裹着一层金属网 在屏蔽层外面才是绝缘外皮 屏蔽层可以有效地隔离外界电磁信号的干扰 这种网线多用于布设网线的环境
  • 三维重建工具——pclpy使用教程

    最近试了试用pclpy这个库进行点云处理 在此对pclpy的使用进行一个总结 更全的pclpy教程 代码完全开源 github 欢迎fork star 相关文章 pclpy安装 文章目录 pclpy相关 开发环境 文件结构 I O读取 构造
  • Git基础操作:push提交多个文件成功后如何撤销回退某个文件,回退代码到某次commit

    之前写过类似的一篇文章 Git基础操作 push提交成功后如何撤销回退 回退代码到某次commit 按照那个示例 把期间所有commitid下的文件都会回滚掉 但是如果只想将其中某个文件回滚可以下面的示例来搞 git log OneBean
  • Broyden算法

    代码传送门 https github com taifyang optimization method Python实现 import sympy import numpy as np from numpy import matlib as
  • java毕业设计——基于Java+AI的五子棋游戏设计与实现(毕业论文+程序源码)——五子棋游戏

    基于Java AI的五子棋游戏设计与实现 毕业论文 程序源码 大家好 今天给大家介绍基于Java AI的五子棋游戏设计与实现 文章末尾附有本毕业设计的论文和源码下载地址哦 需要下载开题报告PPT模板及论文答辩PPT模板等的小伙伴 可以进入我
  • expiringmap入门初体验

    功能简介 可设置Map中的Entry在一段时间后自动过期 key过期 value同时会过期 可设置Map最大容纳值 当到达Maximum size后 再次插入值会导致Map中的第一个值过期 可添加监听事件 在监听到Entry过期时调度监听函
  • linux系统中docker服务和普通服务对外访问端口不通的问题

    linux系统中docker服务和普通服务对外访问端口不通的问题 前一段时间 在一个新的centos 7 4 服务器上运行项目 共有四个项目 因为特殊原因 两个是通过docker 运行 另外两个是通过nginx和tomcat 运行 当运行起
  • 电脑配置tomcat环境变量

    Tomcat在使用前需要配制环境变量 这里以Tomcat9为例进行配置 下载Tomcat压缩包 Tomcat8 链接 https pan baidu com s 109DSHjX3 Gk7lVRVre3xxw 提取码 lsro Tomcat
  • 使用maven依赖的方式引入jQuery

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 加入依赖
  • 栈、队列的链式存储结构

    栈 再说链表的实现栈之前 我们先回顾一下什么是栈 栈基本概念 栈 stack 是限定在表尾进行插入和删除操作的线性表 或单链表 只能在一段进行插入和删除 因此不存在 在中间进行插入 栈顶 top 允许插入和删除的一端 而另一端称为栈底 bo