数据结构——栈与队列的应用

164 阅读1分钟

这是我参与更文挑战的第14天,活动详情查看:更文挑战

栈和队列的应用

  • 括号匹配
  • 表达式求值
  • 递归

队列

  • 层次遍历 (bfs)

11

特殊矩阵的压缩存储

存储计算

  • 一维数组LOC(ai)=LOC(a0)+(i)×L(0i<n)LOC(a_i) = LOC(a_0) + (i) \times L (0 \le i < n)
  • 二维数组 [l1,h1],[l2,h2][l_1,h_1],[l_2,h_2]
1.行优先LOC(ai,j=LOC(al1,L2)+[(il1)×(h2l2+1)+(jl2)]×L2.列优先LOC(ai,j=LOC(al1,L2)+[(jl2)×(h1l1+1)+(il1)]×L 1.行优先 \\ LOC(a_{i,j}) = LOC(a_{l_1,L_2}) + [(i-l_1) \times (h_2 - l_2 + 1)+(j - l_2)] \times L \\ 2.列优先\\ LOC(a_{i,j}) = LOC(a_{l_1,L_2}) + [(j-l_2) \times (h_1 - l_1 + 1)+(i - l_1)] \times L \\

矩阵的压缩

对称矩阵

三角矩阵

三对角矩阵

对角矩阵又名带状矩阵[三个像对角线一样]

  • k=2i+j-3
  • i = |(k+1)/3 +1|
  • j = k-2i+3

稀疏矩阵

对于在实际问题中出现的大型的稀疏矩阵,若用常规分配方法在计算机中储存,将会产生大量的内存浪费,而且在访问和操作的时候也会造成大量时间上的浪费,为了解决这一问题,从而产生了多种解决方案。

由于其自身的稀疏特性,通过压缩可以大大节省稀疏矩阵的内存代价。具体操作是:将非零元素所在的行、列以及它的值构成一个三元组(i,j,v),然后再按某种规律存储这些三元组,这种方法可以节约存储空间。

#define SMAX 1000
typedef struct
{
    int i,j;     //储存非零元素的行和列信息
    ElementType e; //非零元素的值
} Triple;       //定义三元组类型
typedef struct
{
    int mu,nu,tu; //矩阵的行、列和非零元素的个数
    Triple data[SMAX]; //三元组表
} TSMatrix;

举个栗子

那么对于一个简单的矩阵转置,如何使用三元组的情况下实现呢?

image.png

先将表示行列的val值互换,再对其进行重新排序即可。