航空工业出版社《数据结构》课后题答案
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
OPTR 栈
# # #- #- # -* # -* #-
OPND 栈
35 35 35 5 35 5 35 5 10 35 50
当前读入字符
35 - 5 * 10 / /
步骤
8 9 10 11 12 13 14
OPTR 栈 # -/ # -/ #- # #+ #+ #
OPND 栈 35 50 35 50 2 35 25 10 10 10 5 15
{ case
'<': Push (&OPTR, str[i]);
//读入字符优先级高于栈顶字符优先级 //操作符进栈
i ++;
break; case =' ':
Pop (&OPTR, x);
//读入字符优先级等于栈顶字符优先级 //栈顶元素出栈
i ++;
break;
6
课后习题答案
case
} }
'>': Pop (&OPTR, &theta); str2[k ++] = theta; break;
第 1 章 数据结构导论
一、填空题
1.集合结构,线性结构,树形结构,图状结构 2.顺序存储结构,链式存储结构 3.有限性,确定性,可行性,输入,输出 4.时间复杂度,空间复杂度 二、分析下面程序段的时间复杂度。
1.O(m*n) 2.O(n2) 三、上机操作题
1.解答:
#include <stdio.h>
//q 所指结点的值为 item
{ q -> prior -> next = q -> next;
//删除 q 所指结点
q -> next -> prior = q -> prior; free (q);
// 释放 q 所指结点的空间
} q = q -> next;
//q 指向下一结点
}
} 4.解答:
void InsertItem (DLinkList q, ElemType item)
{
DLinkList p; p = (DLinkList) malloc (sizeof (DNode));
p -> da=ta item; p -> pri= or q;
p -> next = q -> next; q -> ne= xt p;
当前读入字符
2 + + + 5 # #
2.解答: char op[7] = {'+', '-', '*', '/', '(', ')', '#'};
//算符数组
char cmp[7][7] = {{'>', '>', '<', '<', '<', '>', '>'}, {'>', '>', '<', '<', '<', '>', '>'},
return 0 ;
// 不等则返回 0
i
--;
} return 1 ;
//比较完毕均相等则返回 1
}
4.解答:
void LineEdit ()
{
SeqStack S, T;
char str[1000];
int strlen = 0;
7
数据结构
char e; char ch; InitStack (&S); InitStack (&T); = ch getchar (); while (ch != EOFILE) {
p -> next -> prior = p;
//生成新结点 // 新结点的数据域赋值 // 将新结点插入到 q 所指结点之后
//修改 p 所指结点的指针域 // 修改 q 所指结点的后继
//修改 p 的后继结点的前驱
}
第 3 章 栈和队列
一、填空题 1.线性 2.栈顶,队尾,队头 3.后进先出,先进先出
s = s + a[i];
} p rintf ("数组中所有元素之和为:%f\n", s);
} 2.解答:
#include <stdio.h>
void main ()
{
int x, y, z, t; printf ("请依次输入 x、y 和 z 的值:\n");
scanf ("%d %d %d", &x, &y, &z);
//读入字符优先级低于栈顶字符优先级 //栈顶元素出栈 //出栈元素复制到 str2 中
} return OK; } 3.解答: int IsHuiwen (char *S) { SeqS tack T;
int i , len;
char t;
InitS tack (&T);
len = StrLength (S);
// 输入字符存入 ch //输入未结束 //输入非回车字符
// 输入字符为‘#’ //栈顶元素出栈
// 输入字符为‘@’ //栈清空
//输入其他字符直接进栈
// 输入字符为回车,直接进栈 // 栈 S 中元素出栈进入栈 T
8
课后习题答案
{ Pop (&S, &e); Push (&T, e);
// 栈顶元素出栈 // 出栈元素压入栈 T
3
数据结构
free (q);
// 释放 q 所指结点的空间
} 3.解答:
void DeleteItem (DLinkList *list, ElemType item)
{
D Node *q; q = (*list) -> next;
//q 指向头结点的后继
while (q != *list)
{ if (q -> data == item)
} while (!StackEmpty(T))
// 栈 T 中元素出栈存入 str
{
Pop (&T, &e);
str[strlen ++] = e;
}
if(ch != EOFILE)
ቤተ መጻሕፍቲ ባይዱ
ch = getchar ();
} str[strle= n] '\0'; printf("\n%s\n ", str);
一、填空题 1.数组 2.数据元素的物理位置,指针 3.单链表,循环链表,双向链表 4.数据,数据元素本身数据信息,指针,直接后继元素地址信息 5.顺序,链式
二、选择题 1.B 2.D 3.C 4.C 5.A
2
6.B 7.C 8.B 9.C 10.B 三、上机操作题
1.解答:
void Reverse (ElemType A[], int n)
{
int i = 0, k = 0;
char x, theta; SeqStack OPTR IniS tack (&OPTR); Push (&OPTR, '#');
//定义运算符栈 // 初始化运算符栈
//将'#'压入栈底
while (str1[i] != '#' || GetTop (OPTR) != '#')
q = *list;
p = list -> next;
r = *list;
while (p != NULL)
{
if (p -> data > q -> data)
{
q = p;
s = r;
}
r = p;
p = p -> next;
}
if = (q= *list)
*list = (*list) -> next;
{
return Q -> quelen == MAXSIZE;
} //进队
void EnQueue (SeqQueue *Q, ElemType e)
{
if (FullQueue (Q))
printf
("队已满,无法进队");
// 字符串结束符 // 输出字符串 str
DestroyStack (&S);
DestroyStack (&T);
} 5.解答: int ACK ( int m, int n) {
if ( m == 0) return n + 1;
if ( m <> 0 && n == 0 ) return ACK( m - 1, 1);
//算符优先关系数组
//输入字符是否属于运算符集合,如果是,返回它在数组中的位置;否则,返回-1
int Isoperator (char ch)
{
int i;
for (i = 0; i < 7; i ++)
{
5
数据结构
if (ch == op[i])
return
i;
}
return -1;
} //比较两个运算符的优先级
{
Elem Type temp;
int i;
for (i = 0; i < n/2; i ++)
{
tem
=p A[i];
A[i] = A[n – i - 1];
A[n – i - 1] = temp;
}
} 2.解答:
void DelMax (LinkList *list)
{
Node *p, *q, *r, *s;
{'>', '>', '>', '>', '<', '>', '>'}, {'>', '>', '>', '>', '<', '>', '>'},
{'<', '<', '<', '<', '<', '=', ' '}, {'>', '>', '>', '>', ' ', '>', '>'},
{'<', '<', '<', '<', '<', ' ', '='}};
while (ch != EOFILE && ch != '\n') {
switch(ch) {
case '#': Pop( &S, &ch); break;
case '@': ClearStack (&S); break;
default: Push (&S, ch); break;
} ch = getchar (); } if (= ch= '\n') Push (&S, ch); while (!StackEmpty(S))
char Compare (char ch1, char ch2)
{
int m, n;
m = Isoperator (ch1);
n = Isoperator (ch2);
return cmp[m][n];
} //将中缀表达式转换为后缀表达式
int TransExpression (char *str1, char *str2)
{ if (str1[i] >= '0' && str1[i] <= '9')
//如果读入字符为数则复制到 str2 中
str2[k ++] = str1[i ++];
else
{ if (Isoperator (str1[i]) == -1)
//如果读入字符不是操作符,则出错
return ERROR; switch (Compare (GetTop (OPTR), str[i])) //比较操作符优先级高低
for ( i = 0; i < l / 2; i ++)
Push(&T
, S[i]);
while( !EmptyStack (&T))
// 求字符串长度 //将一半字符入栈
{ //比较前一半字符和后一半字符是否相等,每弹出一个字符与相应字符比较
Pop
(&T, &t);
if( t != S[l - i])
4
课后习题答案
4.数组,指示栈顶元素的位置 5.将栈顶指针后移一个位置,将被插入元素放在修改后的栈顶指针所指出的位置 6.链式 二、选择题
1.C 2.D 3.C 4.C 5.B 6.A 7.B 8.D 9.C 10.D 三、上机操作题
1.解答:
表 3-1 算术表达式求值的过程
步骤
1 2 3 4 5 6 7
void main ()
{
fl oat a[10];
int i, n;
float s = 0; p rintf ("输入数组中元素的个数 n:");
scanf ("%d", &n);
for (i = 0; i < n; i ++)
{
printf ("a[%d]: ", i);
scanf
("%f", &a[i]);
数据结构
if (x < y)
{
t = x;
x = y;
y
= t;
}
if (x < z)
{
t = x;
x = z;
z
= t;
}
if (y < z)
{
t = y;
y = z;
z
= t;
} printf
("按从大到小的顺序输出:\n");
printf ("%d %d %d\n", x, y, z);
}
第 2 章 线性表
if ( m <> 0 && n <>0 ) return ACK ( m - 1, ACK ( m, n - 1));
} 6.解答: 知道了尾指针和元素个数,当然就能知道队头元素了。算法如下: //判队满,队中元素个数等于空间大小 int FullQueue ( SeqQueue *Q)
9
数据结构
else
s -> next = q -> next;
课后习题答案
// 交换元素 A[i]与 A[n-i-1]的位置
//q 为链表中第一个结点 //p 为链表中第二个结点
//保存当前最大值结点 //保存当前最大值结点的前驱 //保存 p 所指结点位置 //p 指向下一结点 // 链表中第一个结点为最大值结点 //删除第一个结点 //最大值结点不是链表的第一个结点 //删除 q 所指结点