软件技术基础

39
软软软软软软 制制 制制 制制制 软软软 制制制制 制制制制

Upload: jennifer-silva

Post on 30-Dec-2015

53 views

Category:

Documents


7 download

DESCRIPTION

段景山. 软件技术基础. 线性结构. 制作 主讲. 段景山. 栈结构. 2 、堆栈 stack. 栈是特殊的线性表,仅在表的一端进行插入或删除操作. 出栈. 入栈. 栈顶. an. 是抽屉一类物理实体的逻辑抽象 类似仓库、抽屉的结构. a2. 栈底. a1. 特点:( 1 )对栈内数据的操作总在栈顶进行 ( 2 )数据进栈称为“压入” push ( 3 )数据出栈称为“弹出” pop ( 4 )遵循“后进先出”的原则 LIFO. 用数组实现栈. 2.1 用数组实现栈. 栈顶元素 所在位置. a[max]. - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: 软件技术基础

软件技术基础

制作主讲 段景山

段景山

线性结构线性结构

Page 2: 软件技术基础

段景山

栈结构22 、堆栈 、堆栈 stackstack

栈是特殊的线性表,仅在表的一端进行插入或删除操作栈是特殊的线性表,仅在表的一端进行插入或删除操作

an

...

a2

a1

栈顶栈顶入栈入栈 出栈出栈

栈底栈底

是抽屉一类物理实体的逻辑抽象是抽屉一类物理实体的逻辑抽象类似仓库、抽屉的结构类似仓库、抽屉的结构

特点:(特点:( 11 )对栈内数据的操作总在栈顶进行)对栈内数据的操作总在栈顶进行 (( 22 )数据进栈称为“压入”)数据进栈称为“压入” pushpush (( 33 )数据出栈称为“弹出”)数据出栈称为“弹出” poppop (( 44 )遵循“后进先出”的原则)遵循“后进先出”的原则 LIFOLIFO

Page 3: 软件技术基础

段景山

用数组实现栈2.1 用数组实现栈

a[max]

...

a[1]

a[0]

...

a[top] 栈顶

a[0]a[0] 为栈底,为栈底, toptop 为栈顶为栈顶(( 11 )定义)定义

typedef struct stack_type{typedef struct stack_type{elemtype data[MAXNUM];elemtype data[MAXNUM];int top;int top;

}stack_type;}stack_type;

(( 22 )压入 )压入 pushpush

当新元素入栈时,栈顶上移,新元素放在栈顶。当新元素入栈时,栈顶上移,新元素放在栈顶。

...

stack.top = stack.top + 1;

stack.data[stack.top] = new_one;

new_one

栈顶元素栈顶元素所在位置所在位置

aa11

aa22

Page 4: 软件技术基础

段景山

用数组实现栈

...

(( 33 )弹出 )弹出 poppop

从栈顶移出一个数据。从栈顶移出一个数据。 a[max]a[max]

...

a[1]a[1]

a[0]a[0] aa11

aa22

栈顶栈顶栈顶元素拷贝出栈,栈顶下移栈顶元素拷贝出栈,栈顶下移 outout

out = stack.data[stack.top];out = stack.data[stack.top];stack.top = stack.top - 1;stack.top = stack.top - 1;

elemptype pop(stack_type *stack){elemptype pop(stack_type *stack){elemtype out;elemtype out;if(stack->top <= 0) error(3);if(stack->top <= 0) error(3);else{else{

out = stack->data[stack->top];out = stack->data[stack->top];stack->top = stack->top -1;stack->top = stack->top -1;

}}return out; }return out; }

a[top]a[top]

Page 5: 软件技术基础

段景山

用数组实现栈

(( 44 )栈空判断)栈空判断stack.top =stack.top = = 0 = 0 stack.top < 0stack.top < 0

(( 55 )置栈空)置栈空stack.top = -1;stack.top = -1;

栈满判断:栈满判断: stack.top >= MAXNUM - 1;stack.top >= MAXNUM - 1;

a[0]stack.topstack.top

栈顶元素所在位置栈顶元素所在位置

Page 6: 软件技术基础

段景山

用数组实现栈(( 66 )栈的应用)栈的应用例 程序的嵌套,中断的嵌套例 程序的嵌套,中断的嵌套

proc A( )......call B( );......

proc B( )............call C( )......

proc C( )..................

程序程序 AA程序程序 BB

程序程序 CC

Page 7: 软件技术基础

段景山

用数组实现栈(( 66 )栈的应用)栈的应用程序的嵌套,中断的嵌套程序的嵌套,中断的嵌套

proc A( ) ...... call B( ); ......

proc B( )............call C( )......

proc C( )..................

程序 A

程序 B

程序 C程序 A

程序 B

程序 C

Page 8: 软件技术基础

段景山

用链表实现栈 2.22.2 用链表实现栈用链表实现栈

a1 a2 an……

head栈顶在栈顶在 表头表头

(( 11 )定义)定义typedef struct lstack_type{typedef struct lstack_type{

node_type * top;node_type * top;int length;int length;

}lstack_type;}lstack_type;

入栈入栈出栈出栈

toptop

Page 9: 软件技术基础

段景山

用链表实现栈(( 22 )压入)压入 pushpush

void push(stack, new_node){new_node->next = stack->top;stack->top = new_node;stack->length ++;

}

(( 33 )弹出)弹出 poppopnode_type * pop(stack){

node_type* out;out = stack->top;stack->top = stack->top->next;stack->length --;return out;

}

a1

new

…………stack->topstack->top

Page 10: 软件技术基础

段景山

用链表实现栈(( 44 )栈空判断)栈空判断

stack.top == NULL;

(( 55 )置栈空)置栈空能否简单的使用 能否简单的使用 stack.top = NULL ?stack.top = NULL ?如果栈中还有链点,必须逐个将链点占用的空间释放如果栈中还有链点,必须逐个将链点占用的空间释放void clean(stack){

node_type * temp;while( ! empty(stack)){

temp = pop(stack);free(temp); }

}

int empty(stack){if(stack.top == NULL)

return YES;else return NO;

}

11 、逐个将链点弹出、逐个将链点弹出22 、释放链点空间、释放链点空间

Page 11: 软件技术基础

段景山

队列 33 、队列、队列

类似于排队机制的结构类似于排队机制的结构队列是特殊的线性表,队列是特殊的线性表,

节点的插入仅限于在表尾进行,节点的插入仅限于在表尾进行,节点的删除仅限于在表头进行节点的删除仅限于在表头进行

入队入队出队出队队头队头 队尾队尾

Page 12: 软件技术基础

段景山

队列 特点:特点:

(( 11 )对队列的操作在表的两端进行)对队列的操作在表的两端进行(( 22 )仅在队尾加入节点——入队)仅在队尾加入节点——入队 enqueueenqueue

(( 33 )仅在队首移出节点——出队)仅在队首移出节点——出队 dequeuedequeue

(( 44 )遵循“先进先出”的原则——)遵循“先进先出”的原则—— FIFOFIFO

入队入队出队出队队头队头 队尾队尾

Page 13: 软件技术基础

段景山

用数组实现队列 3.13.1 用数组实现队列用数组实现队列 (( 11 )定义)定义

a[0]

队首 队尾

a[1] ... ...a[n] MAX

frontfront rearrear

typedef struct queue_type{typedef struct queue_type{elemtype data[MAXNUM];elemtype data[MAXNUM];int front;int front;int rear;int rear;

}queue_type;}queue_type;

Page 14: 软件技术基础

段景山

用数组实现队列 ( 2 )入队与出队

移元素?移元素? 移队首、尾指针移队首、尾指针

front rear

入队 出队 入队 出队

入队 数组空间溢出而使操作出错

Page 15: 软件技术基础

段景山

用循环数组实现队列 3.23.2 用循环数组实现队列用循环数组实现队列

入队入队rear = rear + 1( )( ) % MAXNUM% MAXNUM

front rear

% % 整除取余整除取余设设 MAXNUM MAXNUM = = 55 ,, rearrear == 44则新元素加入队列后:则新元素加入队列后:rear rear =(=( 44 ++ 11 )% )% 55 == 00 ,新元素放在,新元素放在 a[0]a[0] 内内

Page 16: 软件技术基础

段景山

用循环数组实现队列

front rear

frontrear

队列元素位置?

Page 17: 软件技术基础

段景山

用循环数组实现队列 队空条件队空条件

队满条件队满条件

frontfront

rearrear

frontfrontrearrear

front = = rear

(rear + 1) % MAXNUM = = front(rear + 1) % MAXNUM = = front

如果如果 rearrear 表示队尾表示队尾节点的位置则有一个节点的位置则有一个节点的队列的指针情节点的队列的指针情况和队空时相同况和队空时相同

frontfront rearrear

Page 18: 软件技术基础

段景山

用循环数组实现队列 队空条件队空条件

队满条件队满条件

front

rear

frontrear

front = = rear

(rear + 1) % MAXNUM = = front(rear + 1) % MAXNUM = = front

定义:定义: rearrear 为指为指向队尾下一个可存向队尾下一个可存放节点的位置放节点的位置

队列满时还有队列满时还有一个空位置一个空位置

Page 19: 软件技术基础

段景山

用循环数组实现队列

void enqueue(queue,void enqueue(queue, new_one){new_one){

if( (queue->rear + 1) % MAXNUM =if( (queue->rear + 1) % MAXNUM = = queue->= queue->frontfront ))error(1);error(1);

else{else{queue->data[queue->rear] = new_one;queue->data[queue->rear] = new_one;queue->rear = (queue->rear +1) % MAXNUM;queue->rear = (queue->rear +1) % MAXNUM;

}}

}}

入队算法入队算法队列已满?队列已满?

队列尾部放入新节点队列尾部放入新节点

队尾指示向后移动一格队尾指示向后移动一格

front rear

Page 20: 软件技术基础

段景山

用循环数组实现队列 出队算法--课堂练习出队算法--课堂练习

frontrear

elemtypeelemtype dedequeue(queue){queue(queue){ elemtype outelemtype out ;; if( queue->rear =if( queue->rear = = queue->= queue->frontfront ))

error(2);error(2); else{else{

out out == queue->data[queue->front];queue->data[queue->front];queue->front = (queue->front +1) % MAXNUM;queue->front = (queue->front +1) % MAXNUM;

}} return outreturn out ;;}}

Page 21: 软件技术基础

段景山

用循环数组实现队列 思考:在循环队列的第思考:在循环队列的第 KK 个元素后插入一个个元素后插入一个新元素--插队新元素--插队如何确定如何确定 aaKK 的位置?的位置?如何搬移节点,以腾出空位放入新元素?如何搬移节点,以腾出空位放入新元素?

frontrear

Page 22: 软件技术基础

段景山

用链表实现队列 3.33.3 用链表实现队列用链表实现队列

a1 a2 an……

front rear

(一)定义(一)定义typedef struct lqueue_type{typedef struct lqueue_type{

node_type * front;node_type * front;node_type * rear;node_type * rear;int length;int length;

}}

Page 23: 软件技术基础

段景山

用链表实现队列 (二) 入队(二) 入队

新链点插入到队尾新链点插入到队尾注意:队列为空时,注意:队列为空时, rearrear 和和 frontfront 都要指向新元都要指向新元素素

(三) 出队(三) 出队删除队首链点删除队首链点注意:当队列被删空时,注意:当队列被删空时, rearrear 指针要置空指针要置空

new_node->next = NULL;list->rear ->next = new_node;

list->front = list->front->next;list->front = list->front->next;

temp = list->front;temp = list->front;

a1 a2 an……

frontfront rearrear

Page 24: 软件技术基础

段景山

串结构 44 、串、串

串即字符串:串即字符串:由零到多个字符组成的连续有限序列由零到多个字符组成的连续有限序列

串是一种线性结构串是一种线性结构

串符合线性表的特性(特别是顺序表)串符合线性表的特性(特别是顺序表) 字符串的特殊性在于对串有一些特殊的操作字符串的特殊性在于对串有一些特殊的操作

元素元素 字符字符元素间的关系元素间的关系 字符串中字符的字符串中字符的先后先后次序次序

线性线性

Page 25: 软件技术基础

段景山

串结构 4.14.1 访问操作访问操作

基本访问:基本访问:根据字符在串中位置获得字符;根据字符在串中位置获得字符;根据字符获得它在串中位置根据字符获得它在串中位置

遍历:逐个访问串中字符遍历:逐个访问串中字符部分访问(求子串):部分访问(求子串):

获得串中指定位置开始的多个元素获得串中指定位置开始的多个元素获得子串在串中的位置获得子串在串中的位置

课堂练习:课堂练习:以姓名为例以姓名为例分别给出各分别给出各种操作应用种操作应用示例。示例。如:如:Duan JingsDuan Jingshanhan取得取得 JJ 所在所在的位置可以的位置可以获得姓的长获得姓的长度度

Page 26: 软件技术基础

段景山

串结构 4.24.2 插入插入

基本插入:在串中指定位置插入一个字符基本插入:在串中指定位置插入一个字符子串插入:在串中指定位置插入多个字符子串插入:在串中指定位置插入多个字符

4.34.3 删除删除基本删除:在串中指定位置删除字符基本删除:在串中指定位置删除字符子串删除:在串中指定位置删除多个字符子串删除:在串中指定位置删除多个字符

4.44.4 其它操作其它操作串连接:一个串连在另一个串的后面,形成新串串连接:一个串连在另一个串的后面,形成新串求串长、串比较、子串替换 求串长、串比较、子串替换 ............

串的操作是文字处理的基础串的操作是文字处理的基础

Page 27: 软件技术基础

段景山

串结构 4.54.5 串的实现串的实现

(( 11 )字符数组(用数组实现串))字符数组(用数组实现串)紧缩格式:紧缩格式:

数组每一个单元类型都是字符型,可放入一数组每一个单元类型都是字符型,可放入一个字节的字符个字节的字符

非紧缩格式:非紧缩格式:数组的单元不是字符型——数组的单元不是字符型—— 2~42~4 个字节个字节

DDuuaann

a[0]a[0]a[1]a[1]a[2]a[2]a[3]a[3]

char a[4];char a[4];

共共 44 字节字节

DDuuaann

long a[4];long a[4];

共共 1616 字节字节

a[0]a[0]a[1]a[1]a[2]a[2]a[3]a[3]

Page 28: 软件技术基础

段景山

串结构 (( 22 )字符链表(用链表实现串))字符链表(用链表实现串)

链表的每个链点的元素域放入一个字符链表的每个链点的元素域放入一个字符操作方便,但空间开销大操作方便,但空间开销大

链点元素域占一个字节链点元素域占一个字节链点指针域占四个字节链点指针域占四个字节开销为开销为 4/54/5

s t u d e

t

n

Page 29: 软件技术基础

段景山

二维数组(矩阵) 55 、二维数组、二维数组

行关系,列关系均是线性关系行关系,列关系均是线性关系 5.15.1 二维数组的顺序存放二维数组的顺序存放

(一)行优先存放(一)行优先存放

计算计算 aijaij 的存放位置:的存放位置:

a11 a12

aij

amn

a21

...

...

......

a11 a12... a1na21 a22... ai1 ai2 ...ain... am1 am2 ... amn

Loc(Loc(aaijij) = Loc() = Loc(aa1111) + (( i - 1)*n + (j - 1))*S) + (( i - 1)*n + (j - 1))*S

设每个元素占据设每个元素占据 SS 个存储单元个存储单元

计算前面有多少个元素计算前面有多少个元素

j

i

Page 30: 软件技术基础

段景山

二维数组 (二)列优先存放(二)列优先存放a11 a21... am1a12 a22... am2a1j a2j ...aii... a1n a2n ... amn

Loc(Loc(aaijij) = Loc() = Loc(aa1111) + (( j - 1)*m + (i - 1))*S) + (( j - 1)*m + (i - 1))*S

a11 a12

aij

amn

a21

...

...

...

...

j

i

Page 31: 软件技术基础

段景山

二维数组 5.25.2 矩阵的链接存储矩阵的链接存储

十字链表法十字链表法a11 a12 a1i a1n

a21

a31

am1

a22

a32

am2

......

......data 行指针

列指针

Page 32: 软件技术基础

段景山

二维数组 5.35.3 矩阵的压缩存储矩阵的压缩存储

(1)(1) 对称矩阵,三角矩阵的压缩对称矩阵,三角矩阵的压缩对称矩阵:对称矩阵: a[ i , j ] = a[ j , i ]a[ i , j ] = a[ j , i ]

三角矩阵:上三角为三角矩阵:上三角为 00 ,或下三角为,或下三角为 00

只存储上或下三角内的元素,节约近一半的存只存储上或下三角内的元素,节约近一半的存储空间储空间

a11 a21a22a31a32a33a41… aii... an1 an2 ... ann

...113355 6633

4422

77 442211 5555 33 66

00

Page 33: 软件技术基础

段景山

二维数组 (1)(1) 对称矩阵,三角矩阵的压缩对称矩阵,三角矩阵的压缩

i >= j 时,元素位于下三角

Loc(aij) = Loc(a11) + ( i ( i - 1) / 2 + ( j - 1))*S

i < j 时,元素位于上三角Loc(aij) = Loc(a11) + ( j ( j - 1) / 2 + ( i - 1))*S

a11 a21a22a31a32a33a41… aii... an1 an2 ... ann

...113355 6633

4422

77 442211 5555 33 66

00

1+2+3+…+(i-1)1+2+3+…+(i-1)

Page 34: 软件技术基础

段景山

二维数组 (2)(2) 稀疏矩阵稀疏矩阵

矩阵中的非零元素很少,分布没有规律矩阵中的非零元素很少,分布没有规律利用三元存储法利用三元存储法

先形成三元矩阵先形成三元矩阵再按照行优先顺序方式存储。再按照行优先顺序方式存储。

aij 行值,列值,元素值行值,列值,元素值

AMN =

行数 列数 非零元素个数行值 列值 元素值

...

第一行第一个非零元素

...

行值 列值 元素值 第二个非零元素

Page 35: 软件技术基础

段景山

二维数组 稀疏矩阵压缩存储例稀疏矩阵压缩存储例

110000 6633

0000

00 0000

00 001100

00

XX4848 ==

0000 00

000000000000

441122 4433

1111

22 66

11

3344

AA6363 ==

55117733

5588

00

0055

0000

0000

00

行数 列数 非零元素个数行数 列数 非零元素个数

a[18] = {4,8,5,1,1,1,2,4,1,3,2,6,3,7,5,4,1,3}a[18] = {4,8,5,1,1,1,2,4,1,3,2,6,3,7,5,4,1,3}

Page 36: 软件技术基础

段景山

二维数组 稀疏矩阵三元组定义稀疏矩阵三元组定义

1)1) 定义三元组元素定义三元组元素

2)2) 定义三元组定义三元组

typedef struct tuple3tp{typedef struct tuple3tp{int row_num; /*int row_num; /* 行号行号 */*/int col_num; /*int col_num; /* 列号列号 */*/elemtype value; /*elemtype value; /* 元素值元素值 */*/

} tuple3tp} tuple3tp

typedef struct tuple3{typedef struct tuple3{int row; /*int row; /* 行数行数 */*/int col; /*int col; /* 列数列数 */*/int num; /*int num; /* 非零元素个数非零元素个数 */*/tuple3tp data[ MAXNUM];/* tuple3tp data[ MAXNUM];/* 三元组三元组 */*/

}tuple3;}tuple3;

Page 37: 软件技术基础

段景山

上机习题:稀疏矩阵求转置void transposition(tuple3 * a, tuple3 * b){ int col, i,num; b.row = a.col, b.col = a.row, b.num = a.num; num = 0; for(col = 0; col < a.col ; col ++){ for(i = 0; i < a.num; i ++){ if( a[ i ].col_num = = col ) { b[ num ].col_num = a[ i ].row_num; b[ num ].row_num = a[ i ].col_num; b[ num ].value = a[ i ].value; num += 1; } }} } 注意:部分“ .” 在实际程序中应该为“ ->”

思考:稀疏矩阵相加思考:稀疏矩阵相加

转置后的转置后的矩阵仍以矩阵仍以三元组法,三元组法,行优先存行优先存放放

Page 38: 软件技术基础

段景山

小结

数据结构数据结构数据逻辑结构数据逻辑结构数据存储结构数据存储结构算法算法

线性结构、栈、队列、串线性结构、栈、队列、串用数组实现(顺序用数组实现(顺序 XXXX ))

用链表实现(链接用链表实现(链接 XXXX ))

顺序表与线性链表(单链表、双链表)顺序表与线性链表(单链表、双链表)顺序栈与链栈(应用--回溯性)顺序栈与链栈(应用--回溯性)顺序队列顺序队列 循环队列循环队列二维数组的存储(行优先、列优先,定位)二维数组的存储(行优先、列优先,定位)

数组的压缩(压缩定位,三元组法)数组的压缩(压缩定位,三元组法)

与与循环链表循环链表??与链队列与链队列

Page 39: 软件技术基础

段景山

作业 教材教材 7171 页页 1212 、、 1313 、、 1414