数据结构栈、队列和数组习题答案
(2010-12-26 20:30:08)
标签:
数据结构栈队列数组答案期末复习杂谈 |
分类: 学习资料 |
第三章
一、名词解释(略)
二、填空题
1、
2、
3、
4、
5、
6、
7、
8、
9、
10、
11、
12、
13、
14、
15、
16、
17、
18、
19、
20、
21、
22、
23、
24、
25、
26、
27、
28、
29、
30、
31、
32、
33、
34、
35、
k=
j(j-1)/2+i
36、n-t+1,(i-1)(2n-i+2)/2,j-i+1
(i-1)(2n-i+2)/2+j-i+1
k=
n(n+1)/2+1
n(n+1)/2+1
37、 (i-1)/2+j
k=
n(n+1)/2+1
38、col<=a.nu,a.data[p].j,q++
39、col<=a.nu,cpot[col-1]+num[col-1],cpot[col]++
40、先进后出(后进先出)
41、先进先出(后进后出)
42、ls= =NULL,*x=p->info
43、2230,2374
44、n-1
45、栈
46、EA+222,EA+117
47、lq->front->next= =lq->rear
48、540,108,M[3][10]
三、单项选择题
1、④2、①3、④4、①5、③6、②7、①8、③9、④10②、
11、②12、③13、①②14、②15、④16、①17、②18、③19、④20、①
21、②22、①23、③24、①25、②26、③27、②28、②29、②30、③
31、②32、②33、③34、②35、④
四、简答及应用
1、顺序栈类型定义如下:
#define sqstack_maxsize 顺序栈的容量
typedef struct sqstack
{DataType
int
}SqStackTp
它有两个域:data和top。Data为一个一维数组,用于存储栈中元素,DataType为栈元素的数据类型。Top为int型,它的实际取值范围为0~sqstack_maxsize-1。
2、链栈的类型定义如下:
typedef stuct node
{
}LstackTp;
单链表的第一个结点就是链栈栈顶结点,链栈由栈顶指针惟一确定。栈中的其它结点通过它们的next域链接起来不。栈底结点的next域为NULL。
3、顺序队列的类型定义如下:
#define
typedef struct sqqueue
int
}SqQueueTp
SqQueueTp sq;
该类型变量有三个域:data,front,rear。其中data存储队中元素的一维数组。队头指针front和队尾指针rear定义为整型变量,实际取值范围为0~maxsize-1。
循环队列的类型定义如下:
#define
typedef struct cycqueue{
DataType
Int
}CycqueueTp;
CycqueueTp sq;
4、typedef struct linked_queue
{
}LqueueTp;
typedef struct queueptr
{
}QueptrTp;
QueptrTp
5、#define
{
int
}NODE;
typedef struct spmatrix
{
}SpMatrixTp
6、int length(CycqueueTp sq)
{len=(sq.rear-sq.front+maxsize)%maxsize;
return(len);
}
7、1234、4321、2143、3421、3241、1324、1432、1342、1243、3214、2134、2314、2341、2431
8、
f1(i)=
0
f2 (j)=
0
c=
n(n+1)/2+1
9、(1)k=2i+j-2;
10、运行结果:ABCDEFGHIJKLM
MLKJIHGFEDCBA
11、借助栈将一个带头结点的单链表倒置。
12-
Top-> |
|
|
Top-> |
|
|
Top-> |
|
|
Top-> |
|
|
Top-> |
|
|
Top-> |
|
|
|
|
|
|
|
|
|
|
|
|
1 |
r’’’’ |
||||||
|
|
|
|
|
|
|
|
2 |
r’’’ |
2 |
r’’’ |
||||||
|
|
|
|
|
|
3 |
r’’ |
3 |
r’’ |
3 |
r’’ |
||||||
|
|
|
|
4 |
r’ |
4 |
r’ |
4 |
r’ |
4 |
r’ |
||||||
|
|
5 |
r |
5 |
r |
5 |
r |
5 |
r |
5 |
r |
||||||
|
|
|
|
|
|
|
|
|
|
|
|
调用f(5)前 调用f(5)前 调用f(4)前
Top-> |
|
|
Top-> |
|
|
Top-> |
|
|
Top-> |
|
|
Top-> |
|
|
|
|
|
|
|
|
|
|
|
|
|||||
2 |
r’’’ |
|
|
|
|
|
|
|
|
|||||
3 |
r’’ |
3 |
r’’ |
|
|
|
|
|
|
|||||
4 |
r’ |
4 |
r’ |
4 |
r’ |
|
|
|
|
|||||
5 |
r |
5 |
r |
5 |
r |
5 |
r |
|
|
|||||
|
|
|
|
|
|
|
|
|
|
返回f(1)后 返回f(2)后 返回f(3)后 返回f(4)后 返回f(5)后
五、算法设计
1.本程序中,将客车类定义一个队KE,货车类定义一个队HE,过江渡船定义成一个栈DC。栈采用顺序存储结构,队采用链式存储结构。
#define sqstack_maxsize 10
typedef struct sqstack
{DataType
}SqStackTp;
typedef struct linked_queue
typedef struct queueptr
int InitStack(SqStackTp
void InitQueue (QueptrTp
( lq->front)->next=NULL;
}
int QutQueue(QueptrTp *lp,Data Type *x)
}
int EmptyQueue(QueptrTp lq)
{if (lq.rear==lq.front) return(1);
}
int Push (SqStackTp *sq , DataType x)
else {sq ->top++; sq->data[sq->top]=x;
return(1);}
}
void main()
{
SqStackTp DC;
While(DC.top<sqstack_maxsize)
for
(I=j;I<5;I++)
}
}
2.typedef struct dustack
else {if (I==0){s->top0++;S->elem[S->top0]=X;}
}
}
void
pop(dustktp *S, DataType *X, int I )
{if (I==0)
else {*X =S->elem[S->top0];S->top0--;}
else {if (S->top1= =M+1) error(“栈空!”)
}
}
3.void
initqueue(lklist *lq)
void
outqueue(lklist *lq ,DataType *X)
{if (lq->next=lq )error(“队空!”);
}
4.设cycque[m]\ rear\quelen皆为全局变量
viod
Enqueue (DataType
{ if (quelen= =m+1) error(“队满!”);
}
void
outqueue(DataType
{if (quelen ==0) error (“队空!”);
else { frone
=(real- quelen +1+(m+1))%(m+1);
}
}
5. void trans_mat _trix(DateType a[m][n],SpMatrixTp b )
if (a[I][j])
}
b.mu=m;
b.nu=n; b.tu=p;
}
6.本题首先判断三元组A,B表示的矩阵是否行列相同,若相同才能进行矩阵的加法
运算。若三元组表示的矩阵能进行相加运算,其思路如下:
(1)
(2)
(3)
①若a表元素的j域值小于b表元素的j域值,将a表当前元素插入到c表表尾,a表指针后移。
②若a表元素的j域值大于b表元素的j域值,将b表当前元素插入到c表表尾,b表指针后移。
③若a表元素的j域值等于b表元素的j域值,若a,b表当前元素的v域值和非零,则在c表表尾播入元素的I\j域值等于a表当前元素的I\j域 的值,域v的值等于a,b表的域值的和,将a,b表当前指针后移。
(4) 若a表的指针没到表尾,b表的指针到表尾,将a表剩余元素依次插入到c表表尾,否则,将b表剩余元素依次插入到c表表尾.
SpMaterixTp trsxsum(SpMaterixTp a, SpMaterixTp b , SpMaterixTp c)
{if ( (a .mu=b.
mu)&&(a.nu=b.mu))
if
(a.tu&&b.tu)
}
else if (rowa>rowb)
else if (a.data[I].v +b.data[j].v)
} else {p--;I++;j++};
}
if (I<=a.tu)
}c.tu=p;
}
7.设表达式已存入字符数组A[n]中。
{if ((A[i]=‘(’)||(A[I]=‘[’||(A[I]=‘{’)Push (s,A[I]);
if (emptystack(s)) flag= false;
switch(a[I])
}}
I++;
}
8.int akm(int m ,int n)
else if (n= =0) return(akm (m-1,1));
}
9. int f(int m, int n )
else return(f(m-1,f(m,n-1)));
}
10. 用Knap(S,n)表示背包问题的解,这是一个布尔函数,其参数应满足 S>0,n≥1。背包问题如果有解,其选择只有两种可能:一种是选择的一组物品中不包含Wn,这样Knap(S,n)的解就是Knap(S,n-1)的解,另一种是选择中包含Wn,这时Knap(S,n)的解就是Knap(S-Wn,n)的解。另外可以定义:当S=0时,背包问题总有解,即Knap(0,n)=true ,只要不选择任何物品放入背包即可:当S〈0时,背包问题无解,即Knap(S,n)=false,因为无论怎样选择总不能使重量之和为负值,当S>0但n<1时,背包问题也无解,即Knap(S,n)=false,因为不取任何东西就要使重量为正值总是办不到的。从而,背包问题可以递归定义如下:
上述递归定义是确定的,因为每递归一次n都减1,S也可能减少
11.方法是先依次让单链表上的元素进栈,然后再依次出栈。
{LstackTp s;
}