数据结构_线性表_栈_队列的(面向接口)实现_Unit_1;

本文深入讲解了数据结构中的三种基本类型:线性表、栈和队列。通过面向接口的编程方式,详细介绍了它们的实现原理与操作方法,包括插入、删除、替换和查询等核心功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Topic 1:线性表

package lanqiao;
/**
 * 线性表的接口
 * 我们的这个接口为顺序存储的线性表服务
 * 我们进行面向接口的编程
 * @author wangtong
 *
 */

public interface List {
	//指定的下标(索引)位置插入数据元素(增)
	public void insert(int index,Object obj) throws Exception;
	//删除指定下标(索引)位置的数据(删) 
	//注意我们的这个删除方法的操作一般情况下 都要把我们删除的那个数据给返回出来显示一下的
 	public Object delect(int index) throws Exception;
	//替换指定下标(索引)位置的数据(改)
	public void replace (int index,Object obj) throws Exception;
	//获取指定下标位置的元素(查)
	public Object getData(int index) throws Exception;
	//获取线性表中元素的个数
	public int getSize();
	//判断线性表是否为空
	public boolean isEmpty();
}
package lanqiao;
/**
 * 
 * 实现List接口 完成顺序存储的线性表
 * 底层实现是数组
 * 我们要时刻注意  size指的是元素的个数  他等于下标减一
 * @author wangtong
 *
 */
public class LinearList implements List {
	
	//线性表的默认长度
	private final int defaultSize = 10;
	//线性表的总长度
	private int totalSize ;
	//线性表中元素个数
	private int size;
	//顺序存储的线性表
	private Object[] linearList;
	//无参构造函数  这个无参构造函数应当构造一个默认长度的线性表
	//所以我们先写一个实现构造默认函数
	private void init (int sz) {
		totalSize = sz;
		size = 0;
		linearList = new Object[sz];
	}
	//无参构造
	public LinearList () {
		init(defaultSize);
	}
	//有参构造函数
	public LinearList (int size) {
		init(size);
	}
	
	
	@Override
	public void insert(int index, Object obj) throws Exception {
		//先判断线性表是否有空余的位置
		if (size == totalSize) {
			throw new Exception("线性表已满,无法插入!!!");
		}
		//再判断索引是否越界  
		/*
		 * 只允许在线性表元素的之前后之后插入  不能在一个空位置的之后插入
		 * 我们这里的判断条件设置为判断 index > size 要是成立的话那么就会
		 * 在一个空位置的之后插入  不符合  ;index = size是允许的这个时候
		 * 就是在最后一个元素的后面插入
		 */
		if (index > size) {
			throw new Exception("插入的位置不正确!!!");
		}
		//索引满足条件之后  我们要把插入位置的元素及其以后的元素都向后移动
		//我们这里要注意移动的顺序  要从后往前执行才能保证数据不会被覆盖
		for (int i = size - 1; i >= index; i--) {
			linearList[i+1] = linearList[i];
		}
		//插入元素
		linearList[index] = obj;
		//记录元素的插入
		size ++;
	}

	@Override
	public Object delect(int index) throws Exception {
		//判断线性表是否为空
		if (size == 0) {
			throw new Exception ("线性表已空,无法删除!!!");
		}
		//判断索引是否有错
		if (index > size-1) {
			throw new Exception ("删除的元素不存在!!!");
		}
		//当索引符合要求之后开始删除
		//先获得我们要删除的元素  不然一会给覆盖了
		Object temp = linearList[index];
		//从index的后一位开始往前移动
		for (int i = index; i < size - 1; i++) {
			linearList[i] = linearList[i+1];
		}
		//删除减一
		size --;
		return temp;
	}

	@Override
	public void replace(int index, Object obj) throws Exception {
		//判断线性表为空
		if (size == 0) {
			throw new Exception ("线性表已空,无法替换!!!");
		}
		//判断索引是否越界
		if (index > size-1) {
			throw new Exception ("替换的元素的下标错误(下标指向的那个元素为null)!!!");
		}
		//替换
		linearList[index] = obj;
	}

	@Override
	public Object getData(int index) throws Exception {
		//判断线性表为空
		if (size == 0) {
			throw new Exception ("线性表已空,无法查找元素!!!");
		}
		//判断索引是否越界
		if (index > size-1) {
			throw new Exception ("查找的那个元素为null(下标指向的那个元素为null)!!!");
		}
		return linearList[index];
	}

	@Override
	public int getSize() {
		return size;
	}

	@Override
	public boolean isEmpty() {
//		if (size == 0) {
//			return true;
//		} else {
//			return false;
//		}
		//看简单的代码
		return size == 0;
		
	}
	
	//增加方法   print 
	public void print () {
		//  我们这里使用增强for会出现问题
		for (int i = 0; i < size; i++) {
			System.out.println(linearList[i]);
		}
	}
	
	//增加方法追加  表示在线性表的后面加一个元素
	public void append(Object obj) throws Exception {
		//先判断线性表是否有空余的位置
		if (size == totalSize) {
			throw new Exception("线性表已满,无法插入!!!");
		}
		size ++;//为了解决第一个元素的加入
		linearList[size - 1] = obj;
	}

}
package test;

import lanqiao.LinearList;

/**
 * 测试我们写的顺序存储的线性表
 * @author wangtong
 *
 */

public class TestLinearList {
	public static void main (String[] args) {
		//无参构造
		LinearList ll = new LinearList() ;
		//有参构造
		//LinearList ll2 = new LinearList(20);
		
		try {
			for(int i = 0; i < 10; i++)
				ll.append(i);
			System.out.println(ll.getSize());
			System.out.println("------------------------------------------");
			System.out.println("删除" + ll.delect(5));
			System.out.println("------------------------------------------");
			System.out.println(ll.getSize());
			System.out.println("------------------------------------------");
			System.out.println(ll.getData(5));
			System.out.println(ll.getData(6));
			ll.replace(1,3);
			System.out.println("------------------------------------------");
			ll.print();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		
	}
	
}

Topic 2 : 栈

package lanqiao;
/**
 * 实现栈的面向接口编程
 * 先进后出  栈的删除(出栈)并不是真正的删除  
 * 他只是把指针变量挪了一位
 * @author wangtong
 *
 */

public interface StackInterface {
	//进栈(压栈)
	public void push (Object obj) throws Exception;
	//出栈   跟以前一样删除一个元素要  返回这个元素看看删除的是什么
	public Object pop () throws Exception;
	//查看栈顶元素但不删除
	public Object getTop () throws Exception;
	//判断是否为空栈
	public boolean isEmpty();
}
package lanqiao;
/**
 * 栈类的实现
 * @author wangtong
 *
 */
public class Stack implements StackInterface{

	//栈顶指针  也表示栈内的元素个数 
	private int top;
	//栈的总空间
	private int totalSize;
	//默认栈的空间
	private final int defaultSize = 10;
	//栈的容器
	private Object[] stack;
	//初始化方法
	private void init( int sz) {
		top = 0;
		totalSize = sz;
		stack = new Object[sz];
	}
	//无参构造器
	public Stack () {
		init(defaultSize);
	}
	//有参构造器
	public Stack (int size) {
		init(size);
	}
	
	@Override
	public void push(Object obj) throws Exception {
		//检测栈是否已满
		if (top == totalSize) {
			throw new Exception("栈已满!!!");
		}
		stack[top] = obj;
		top ++;
		
	}

	@Override
	public Object pop() throws Exception {
		//检测栈是否为空
		if (top == 0) {
			throw new Exception("栈为空!!!");
		}
		top --;
		return stack[top];
	}

	@Override
	public Object getTop() throws Exception {
		//检测栈是否为空
		if (top == 0) {
			throw new Exception("栈为空!!!");
		}
		return stack[top - 1];
	}

	@Override
	public boolean isEmpty() {
		return top == 0;
	}
	
}
package lanqiao;
/**
 * 测试自己栈的实现
 * 基于数组的顺序栈
 * @author wangtong
 *
 */
public class TestStack {
	public static void main (String[] args) {
		Stack s = new Stack();
		
		try {
			for (int i = 0; i < 10; i++) {
				s.push(i);
				System.out.println(s.getTop());
			}
			// 逐个出栈
			while (!s.isEmpty()) {
				System.out.println(s.pop());
			}
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}
}

Topic 3:队列

package lanqiao;
/**
 * 队列的特点是队头删除  队尾插入
 * 实现队列的面向接口编程
 * @author wangtong
 *
 */

public interface QueueInterface {
	//入队
	public void enter (Object obj) throws Exception;
	//出队
	public Object out () throws Exception;
	//获取但不删除队首元素
	public Object lookFront () throws Exception;
	//判空
	public boolean isEmpty () ;
	
}

 

package lanqiao;
/**
 * 队列的实现类
 * @author wangtong
 *
 */
public class Queue implements QueueInterface{
	private Object[] queue;
	private int front;
	private int rear;
	private final int defaultSize = 10;
	private int totalSize;
	
	private void init (int size) {
		front = 0;
		rear = 0;
		totalSize = size;
		queue = new Object[size];
	}
	
	public Queue () {
		init(defaultSize);
	}
	public Queue (int size) {
		init(size);
	}

	@Override
	public void enter(Object obj) throws Exception {
		//判满
		if (front == totalSize) {
			throw new Exception ("你的队列已满!!!");
		}
		queue[rear++] = obj;//先赋值  后加加
		
	}

	@Override
	public Object out() throws Exception {
		//判空
		if (isEmpty()) {
			throw new Exception ("栈为空!!!");
		}
		Object temp = queue[front++]; 
		return temp;
	}

	@Override
	public Object lookFront() throws Exception {
		//判空
		if (isEmpty()) {
			throw new Exception ("栈为空!!!");
		}
		return queue[front];
	}

	@Override
	public boolean isEmpty() {
		return front == rear;
	}
	
	//增加方法  自身的长度
	public int length () {
		return  rear - front;
	}
	
}
package lanqiao;
/**
 * 测试字节写的顺序存储结构的队列
 * @author wangtong
 *
 */
public class TestQueue {
	public static void main (String[] args) throws Exception  {
		Queue q = new Queue();
		for (int i = 0; i < 9; i++) {
			q.enter(i);
		}
		
		System.out.println(q.out());
		q.enter(1);
		System.out.println(q.length());
	}
}

 

标题基于SpringBoot+Vue的学生交流互助平台研究AI更换标题第1章引言介绍学生交流互助平台的研究背景、意义、现状、方法与创新点。1.1研究背景与意义分析学生交流互助平台在当前教育环境下的需求及其重要性。1.2国内外研究现状综述国内外在学生交流互助平台方面的研究进展与实践应用。1.3研究方法与创新点概述本研究采用的方法论、技术路线及预期的创新成果。第2章相关理论阐述SpringBoot与Vue框架的理论基础及在学生交流互助平台中的应用。2.1SpringBoot框架概述介绍SpringBoot框架的核心思想、特点及优势。2.2Vue框架概述阐述Vue框架的基本原理、组件化开发思想及与前端的交互机制。2.3SpringBoot与Vue的整合应用探讨SpringBoot与Vue在学生交流互助平台中的整合方式及优势。第3章平台需求分析深入分析学生交流互助平台的功能需求、非功能需求及用户体验要求。3.1功能需求分析详细阐述平台的各项功能需求,如用户管理、信息交流、互助学习等。3.2非功能需求分析对平台的性能、安全性、可扩展性等非功能需求进行分析。3.3用户体验要求从用户角度出发,提出平台在易用性、美观性等方面的要求。第4章平台设计与实现具体描述学生交流互助平台的架构设计、功能实现及前后端交互细节。4.1平台架构设计给出平台的整体架构设计,包括前后端分离、微服务架构等思想的应用。4.2功能模块实现详细阐述各个功能模块的实现过程,如用户登录注册、信息发布与查看、在线交流等。4.3前后端交互细节介绍前后端数据交互的方式、接口设计及数据传输过程中的安全问题。第5章平台测试与优化对平台进行全面的测试,发现并解决潜在问题,同时进行优化以提高性能。5.1测试环境与方案介绍测试环境的搭建及所采用的测试方案,包括单元测试、集成测试等。5.2测试结果分析对测试结果进行详细分析,找出问题的根源并
内容概要:本文详细介绍了一个基于灰狼优化算法(GWO)优化的卷积双向长短期记忆神经网络(CNN-BiLSTM)融合注意力机制的多变量多步时间序列预测项目。该项目旨在解决传统时序预测方法难以捕捉非线性、复杂时序依赖关系的问题,通过融合CNN的空间特征提取、BiLSTM的时序建模能力及注意力机制的动态权重调节能力,实现对多变量多步时间序列的精准预测。项目不仅涵盖了数据预处理、模型构建与训练、性能评估,还包括了GUI界面的设计与实现。此外,文章还讨论了模型的部署、应用领域及其未来改进方向。 适合人群:具备一定编程基础,特别是对深度学习、时间序列预测及优化算法有一定了解的研发人员和数据科学家。 使用场景及目标:①用于智能电网负荷预测、金融市场多资产价格预测、环境气象多参数预报、智能制造设备状态监测与预测维护、交通流量预测与智慧交通管理、医疗健康多指标预测等领域;②提升多变量多步时间序列预测精度,优化资源调度和风险管控;③实现自动化超参数优化,降低人工调参成本,提高模型训练效率;④增强模型对复杂时序数据特征的学习能力,促进智能决策支持应用。 阅读建议:此资源不仅提供了详细的代码实现和模型架构解析,还深入探讨了模型优化和实际应用中的挑战与解决方案。因此,在学习过程中,建议结合理论与实践,逐步理解各个模块的功能和实现细节,并尝试在自己的项目中应用这些技术和方法。同时,注意数据预处理的重要性,合理设置模型参数与网络结构,控制多步预测误差传播,防范过拟合,规划计算资源与训练时间,关注模型的可解释性和透明度,以及持续更新与迭代模型,以适应数据分布的变化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值