博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
数据结构--数组、使用数组表示矩阵
阅读量:2444 次
发布时间:2019-05-10

本文共 7123 字,大约阅读时间需要 23 分钟。

数组

一维数组:

在这里插入图片描述

多维数组:

在这里插入图片描述
行主序:
在这里插入图片描述
列主序:
在这里插入图片描述
1. 静态顺序存储结构:

在这里插入图片描述

2. 动态二维数组的存储结构
在这里插入图片描述

使用数组表示矩阵

在这里插入图片描述

在这里插入图片描述
矩阵类的抽象描述:

package pers.zhang.array;/** * @author zhang * @date 2020/1/19 - 10:36 * * 矩阵接口 */public interface MMatrix {
//返回矩阵第i行第j列元素值 int get(int i, int j); //设置矩阵第i行第j列元素值 void set(int i, int j, int value); //矩阵相加,this+=mat,各对应元素相加;改变this矩阵 void add(MMatrix mat); //返回this与mat相加后的矩阵,不改变this矩阵 MMatrix plus(MMatrix mat); //返回当前矩阵的转置矩阵 MMatrix transpose(); boolean equals(Object obj);}

实现:

package pers.zhang.array;/** * @author zhang * @date 2020/1/19 - 10:42 * * 矩阵类 */public class Matrix {
//存储矩阵元素的二维数组 private int element[][]; //构造m*n零矩阵 public Matrix(int m, int n){
this.element = new int[m][n];//数组元素初值为0 } //构造n*n矩阵 public Matrix(int n){
this(n, n); } //构造m*n矩阵,由mat提供元素 public Matrix(int m, int n, int mat[][]){
this(m, n); for(int i = 0; i < mat.length && i < m; i++) for(int j = 0; j < mat[i].length && j < n; j++) this.element[i][j] = mat[i][j]; } //深拷贝构造 public Matrix(Matrix mat){
this(mat.element.length, mat.element[0].length, mat.element); } //返回矩阵第i行第j列元素值,O(1) public int get(int i, int j){
return this.element[i][j];//若i、j下标越界,Java将抛出数组下标越界异常ArrayIndexOutOfBoundsException } //设置矩阵第i行第j列的元素 public void set(int i, int j, int value){
this.element[i][j] = value; } //返回矩阵所有元素的描述字符串,行主序遍历 public String toString(){
String str = " 矩阵" + this.getClass().getName() + "(" + this.element.length+"×"+this.element[0].length+"):\n"; for (int i = 0; i < this.element.length; i++){
for (int j = 0; j < this.element[i].length; j++) str += String.format("%4d", this.element[i][j]); str += "\n"; } return str; } //当前矩阵与mat矩阵相加,this += mat,各对应元素相加;改变当前矩阵 public void add(Matrix mat){
if(this.element.length != mat.element.length || this.element[0].length != mat.element[0].length) throw new IllegalArgumentException("两个矩阵阶数不同,不能相加"); for(int i = 0; i < this.element.length; i++) for(int j = 0; j < this.element[i].length; j++) this.element[i][j] += mat.element[i][j]; } //返回当前矩阵与mat相加后的矩阵,不改变当前矩阵,=this+mat,各对应元素相加 public Matrix plus(Matrix mat){
Matrix matc = new Matrix(this); //深拷贝 matc.add(mat); return matc; //返回对象引用 } //比较两个同阶矩阵是否相等 public boolean equals(Object obj){
if (this == obj) return true; if (!(obj instanceof Matrix)) return false; Matrix mat = (Matrix)obj; if (this.element.length != mat.element.length || this.element[0].length != mat.element[0].length) return false; for (int i = 0; i < this.element.length; i++) for (int j = 0; j < this.element[i].length; j++) if (this.element[i][j]!=mat.element[i][j]) //比较对应元素是否相等 return false; return true; } //返回当前矩阵的转置矩阵 public Matrix transpose(){
Matrix trans = new Matrix(this.element[0].length, this.element.length);//构造零矩阵 for (int i = 0; i < this.element.length; i++) for (int j = 0; j < this.element[i].length; j++) trans.element[j][i]=this.element[i][j]; return trans; //返回对象引用 } //判断当前矩阵是否为上三角矩阵 public boolean isUpTriangular(){
if(this.element.length != this.element[0].length) return false; for(int i = 0; i < this.element.length; i++) for(int j = 0; j < i; j++) if(this.element[i][j] != 0)//下三角元素应为0 return false; } //判断当前矩阵是否为下三角矩阵 public boolean isDownTriangular(){
if(this.element.length != this.element[0].length) return false; for (int i = 0; i < this.element.length; i++) for (int j = i+1; j < this.element.length; j++) if (this.element[i][j] != 0)//上三角元素应为0 return false; return true; } //判断当前矩阵是否为对称矩阵 public boolean isSymmetric(){
if (this.element.length != this.element[0].length) return false; for (int i = 0; i < this.element.length; i++) for (int j = 0; j < this.element[i].length; j++) if (this.element[i][j] != this.element[j][i]) return false; return true; }}

测试:

package pers.zhang.array;/** * @author zhang * @date 2020/1/19 - 13:21 */public class Matrix_ex {
public static void main(String args[]) {
int m1[][]={
{
1,2,3},{
4,5,6,7,8},{
9,10,11}}; Matrix mata=new Matrix(3,4,m1); //矩阵对象,初值不足时自动补0,忽略多余元素 System.out.print("A"+mata.toString()); Matrix matb=new Matrix(3,4); //构造空矩阵对象 matb.set(0,0,1); matb.set(1,1,1); matb.set(2,2,1); System.out.print("B"+matb.toString()); Matrix matc = mata.plus(matb); System.out.print("C=A+B"+matc.toString()); mata.add(matb); System.out.print("A+=B"+mata.toString()); //习题5 System.out.println("\n//习题5"); System.out.println("C.equals(A)?"+matc.equals(mata)); System.out.print("A的转置矩阵"+mata.transpose().toString()); System.out.print("B的转置矩阵"+matb.transpose().toString()+"\n"); System.out.println("A是上三角矩阵?"+mata.isUpTriangular()); int m2[][]={
{
1,2,3,4},{
0,5,6,7},{
0,0,8,9}}; Matrix mate=new Matrix(4,4,m2); //初值不足时自动补0 System.out.print("E"+mate.toString()); System.out.println("E是上三角矩阵?"+mate.isUpTriangular()+"\n"); System.out.println("A是下三角矩阵?"+mata.isDownTriangular()); int m3[][]={
{
1},{
2,3},{
0,4},{
5,6,7}}; //初值不足时自动补0 Matrix matf=new Matrix(4,4,m3); System.out.print("F"+matf.toString()); System.out.println("F是下三角矩阵?"+matf.isDownTriangular()+"\n"); System.out.println("A是对称矩阵?"+mata.isSymmetric()); int m4[][]={
{
1,2,3,4},{
2},{
3},{
4}}; Matrix matg=new Matrix(4,4,m4); System.out.print("G"+matg.toString()); System.out.println("G是对称矩阵?"+matg.isSymmetric()); }}/*程序运行结果如下:A 矩阵Matrix(3×4): 1 2 3 0 4 5 6 7 9 10 11 0B 矩阵Matrix(3×4): 1 0 0 0 0 1 0 0 0 0 1 0C=A+B 矩阵Matrix(3×4): 2 2 3 0 4 6 6 7 9 10 12 0A+=B 矩阵Matrix(3×4): 2 2 3 0 4 6 6 7 9 10 12 0//习题5C.equals(A)?trueA的转置矩阵 矩阵Matrix(4×3): 2 4 9 2 6 10 3 6 12 0 7 0B的转置矩阵 矩阵Matrix(4×3): 1 0 0 0 1 0 0 0 1 0 0 0A是上三角矩阵?falseE 矩阵Matrix(4×4): 1 2 3 4 0 5 6 7 0 0 8 9 0 0 0 0E是上三角矩阵?trueA是下三角矩阵?falseF 矩阵Matrix(4×4): 1 0 0 0 2 3 0 0 0 4 0 0 5 6 7 0F是下三角矩阵?trueA是对称矩阵?falseG 矩阵Matrix(4×4): 1 2 3 4 2 0 0 0 3 0 0 0 4 0 0 0G是对称矩阵?true*/

转载地址:http://eypqb.baihongyu.com/

你可能感兴趣的文章
openbiz_Openbiz Cubi:健壮PHP应用程序框架,第1部分
查看>>
使用PHP从Access数据库中提取对象,第1部分
查看>>
使用云waf的案例_9种流行的云使用案例
查看>>
类集合转换类集合_PHP中的集合类
查看>>
使用SimplePie消费Feed
查看>>
运算符二进制_基本转换和二进制运算符
查看>>
SitePoint播客#121:在线社区圆桌会议第2部分
查看>>
pchart_用pChart绘制图表
查看>>
Git简介,第1部分
查看>>
微信 获取地理位置名称_使用地理名称的目标地理位置
查看>>
graph api_与Facebook Graph API集成
查看>>
本地应用程序_本地化PHP应用程序的“正确方法”,第4部分
查看>>
mfc单文档绘制世界坐标系_文档使世界运转
查看>>
防止跨站请求伪造(CSRF)
查看>>
科创板 云计算业务公司_云计算对您的业务意味着什么
查看>>
SitePoint播客#80:与澳大利亚团队的FullCodePress
查看>>
BigCommerce和Volusion:比较设置和移动
查看>>
使用codeigniter_使用CodeIgniter探索面向方面的编程,第2部分
查看>>
用Wufoo创建简单表单:开发人员的观点
查看>>
heroku_使用Heroku和Facebook SDK在云中构建您的应用
查看>>