数据结构-栈,队列,数组

1 知识框架

在这里插入图片描述

2 栈

定义:只允许在一端进行插入或删除得到线性表
栈的数学性质:n个不同元素进栈,出栈的不同排列有在这里插入图片描述

2.1 顺序栈

定义:

typedef struct
{
	int data[MaxSize];
	int top;   // 栈顶指针  初始化top = -1,栈顶元素:S.data[top]
}Stack;

1.进栈

bool Push(Stack &s,int x)    //为什么用&,这里不用&,传的就是形参,存进来的数据不会改变内存中的栈
{
	if(s.top == MaxSize - 1)
		return false;
	s.data[++ s.top] = x;
	return true;
}

2.出栈

bool Pop(Stack &s,int &x)
{
	if(s.top == -1)
		return false;
	x = s.data[top --];
	return true;
}

2.2 链式栈

在这里插入图片描述
定义:

typedef struct Linknode
{
	int data;
	struct Linknode *next;
}*Stack;

3 队列

定义:在表的一端进行插入,在表的另一端进行删除的线性表。

3.1 顺序队列

定义:

typedef struct
{
	int data[MaxSize];
	int front,rear;   //初始化 front = rear = 0;
}Queue;

1.进队

bool Push(Queue &s,int x)
{
	if(s.rear == MaxSize)    //并不是真正的队满,假溢出
		return false;
	s.data[rear ++] = x;
	return true;
}

2.出队

bool Pop(Queue &s,int &x)
{
	if(s.front == s.rear)
		return false;
	x = s.data[front ++];
}

3.2 循环队列

1.初始:Q.front = Q.rear = 0;
2.入队:Q.rear = (Q.rear + 1) % MaxSize;
3.出队:Q.front = (Q.front + 1) % MaxSize;
4.队长:(Q.rear - Q.front + MaxSize) % Maxsize;
5.判空:Q.rear == Q.front;
6.判满:Q.front == (Q.rear + 1) % MaxSize //队列留出一个位置作为队列判满的条件,不然rear == front可以是队空,也可以是队满。
在这里插入图片描述

3.3 链式队列

定义:

typedef struct LinkNode
{
	int data;
	struct LinkNode *next;
}LinkNode;                //队列节点

typedef struct 
{
	LinkNode *front,*rear;
}*LinkQueue;    //无名结构体    使用:  别名 变量名   LinkQueue linkQueue;

4 数组

4.1 二维数组

二维数组在内存中的位置的两种映射方式。
1.先行后列

//位置计算方法  L是每个数组元素所占的存储空间大小  int  4个字节
A[2][3]
ADD(A[i][j]) = ADD(A[0][0])+(i * 4 + j) * L;

2.先列后行

//位置计算方法  L是每个数组元素所占的存储空间大小  int  4个字节
A[2][3]
ADD(A[i][j]) = ADD(A[0][0])+(j * 3 + i) * L;

4.2 特殊数组的压缩存储

1.对称矩阵
定义: a[i][j] = a[j][i]
在这里插入图片描述
假设只存储下三角区(i > j)
则:
在这里插入图片描述

2.三角矩阵
定义:上三角或者下三角的所有元素为同一个常量
在这里插入图片描述
存储:(下三角)在数组中先存完三角元素和对角线,再存储常量。
在这里插入图片描述

3.三对角矩阵
定义:|i- j| > 1时,A[i][j] = 0,又称带状矩阵
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值