1、利用两个栈S1,S2模拟一个队列,如何利用栈的运算来实现队列的插入和删除运算?
//分析:队列是先进先出,假设top1为队列头指针,top2为队列尾指针。
1、插入
void Insert(DaTaype x, SeqStack *S1,SeqStack *S2)
{
if (top2 == n) printf('满了');
top2++;
if (top2 > 0)
{
S2.data[top2] = x;
}
else
{
S1.data[top2] = x;
}
}
2、删除
DataType Detele(SeqStack * S1, SeqStack * S2)
{
if (top1 > top2)
printf('空了');
if (top1 < 1)
x = S1.data[top1];
else
x = S2.data[top];
top1++;
return x;
}
设计一个算法,实现矩阵Amn的转置矩阵Bnm;
//分析:对于一个m×n的矩阵A,转置矩阵是一个n×m的矩阵B,而且B[i][j] == A[j][i];
//0<=i<=n-1;0<=j<=m-1; 假设m = 5, n = 8;
void Trsmat(int a[][8], int b[][5], int n, int m)
{
int i, j;
for (j = 0; j < m; j++)
{
for (i = 0; i < n; i++)
{
b[i][j] = a[j][i]
}
}
}
写一个算法,建立顺序存储稀疏矩阵的三元组表
// 分析:假设A为一个稀疏矩阵,其数据存储在二维数组a中,b为一个存放对应与A的矩阵生成的三元组表,在这个算法中,要进行二重循环来判断每个矩阵元素是否为0,若不为0,则将其行,列下标及其值存入b中。
void CreateTriTable(TSMatrix * b, int a[][5], int m, int n)
{
int i, j, k = 0;
for (i = 0; i < m; i++)
{
for (j = 0; j < n; j++)
{
if (a[i][j] != 0) // 找出非零元素
{
b->data[k].i = i; //记录非零元素行下标
b->data[k].j = j; //记录非零元素列下标
b->data[k].v = a[i][j]; //保存非零值
K++; // 统计非零数
}
b->m = m; // 记录矩阵行与列数
b->n = n;
b->t = k;
}
}
}
写一个算法,实现三元组表结构存储的稀疏矩阵的转置运算
void TransMatrix(TSMatrix a, TSMatrix * b)
{
int p, q, col;
b->m = s.n;
b->n = a.m;
b->t = a.t;
if (b->t <= 0)
{
printf('m中无非零元素')
}
else
{
q = 0;
for (col = 0; col < count; ++col)
{
for (p = 0; p < count; p++)
{
if (a.data[p].j == col)
{
b->data[q].i = a.data[p].j;
b->data[q].j = a.data[p].i;
b->data[q].v = a.data[p].v;
++q;
}
}
}
}
}