数据结构教程李春葆第3章(第4版)—课后答案
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
空。
(2)ef 使g 一个h 栈i 判j 操作序列是否合法,其中A 为存k 操作序
列的lm 数组,
n 为n 数组的元素个数(这o 的 ElemType pq 设定为 char)。对应的算法r 下:
int judge(char A[],int n)
{ int i;
ElemType x;
LiStack *ls;
(1)B 出栈,A 出栈,E 入栈,E 出栈,输出序列为 CDBAE; (2)B 出栈,E 入栈,E 出栈,A 出栈,输出序列为 CDBEA; (3)E 入栈,E 出栈,B 出栈,A 出栈,输出序列为 CDEBA。 所以可能的次序有:CDBAE、CDBEA、CDEBA。
3.2 假设以 I 和 O 分别表示入栈和出栈操作,栈的初态和终栈均为空,入 栈和出栈的操 作序列可表示为仅由I 和 O 组成的序列。
if (st[top]=='{') top--;
else tag=0;
i++;
}Baidu Nhomakorabea
if (top>=0) tag=0; //若栈不空,则不配对
return(tag);
}
3.4 设枟?输入一?数序列 a1,a2,...an,殈洔 :? ai>0 ?,ai ?,? ai<0 ?, 、元素出?,? ai=0 ?,表示输入¥。要? ?列憭成Η?列,入?
{ tail->next=QH[i];
tail=QT[i];
}
}
printf("\n 输出所有元素:");
while (head!=NULL)
{ printf("%d ",head->data);
head=head->next;
}
printf("\n");
}
void main()
{ int i;
QNode *QH[MAXQNode],*QT[MAXQNode]; //各队列的队头 QH 和队尾指针 QT for
数据结构教程李春葆第 3 章(第 4 版)—课后答案
3.1 有5 个元素,其入栈次序为:A、B、C、D、E,在各种可能的出栈次 序中,以元素 C、D 最先出栈(即C 第一个且D 第二个出栈)的次序有哪几个?
答:要使C 第一个且D 第二个出栈,应是A 入栈,B 入栈,C 入栈,C 出栈, D 入栈,D 出 栈,之后可以有以下几种情况:
图 3.1 环形队列
解:使g 一个栈脣过?的作g。先 sq?列中元素出— 其入栈ss,艐? 列空为 ?;?后初壬?列, sq->front 和sq->rear 均?为0;再出栈元素? 其入?
列,艐栈空 为?。对应的算法r 下:
void Reverse(SqQueue *&sq)
{ ElemType x;
qu->data[qu->rear]=a; } } else if (a<0) { if (qu->rear==qu->front)
printf(" 队列空,不能出队\n"); else { qu->front=(qu->front+1)%QueueSize; //出队
x=qu->data[qu->front]; printf(" 出队元素:%d\n",x); } } else break; } }
//队列元素下标从 1 到 n
sq->front=n;
x=sq->data[sq->front];
ss->top++;ss->data[ss->top]=x; //将 x 入栈
} //sq 栈中从栈顶到栈底的元素为:f,e,d,c,b,a
sq->front=sq->rear=0;
//队列初始化
while (ss->top>=0)
if (st[top]=='(') top--;
else tag=0;
if (exp[i]==']') //遇到']',若栈顶是'[',则继续处理,否则以不配对返回
if (st[top]=='[') top--;
else tag=0;
if (exp[i]=='}') //遇到'}',若栈顶是'{',则继续处理,否则以不配对返回
}
return (StackEmpty(ls)); //栈为空时返回 1;否则返回 0
}
3.3 假设表st 中uvwx 3 种yz:{yz、|yz 和}yz。~写一个算法判j 表
st 中的yz 是否 € 对。
解:设?一个栈 儎,厗表st 噲?,妺'('、'['?'{',则 其入栈;妺')',若栈?是
int top=-1,i=0,tag=1;
while (i<n && tag==1)
{
if (exp[i]=='(' || exp[i]=='[' || exp[i]=='{')
//遇到'('、'['或'{',则将其入栈
{
top++;
st[top]=exp[i];
}
if (exp[i]==')') //遇到')',若栈顶是'(',则继续处理,否则以不配对返回
3.5 ~写一个算法, 一个Η?列(冀为 n,元素下緰 1 ? n)的元素總。?r,? 3.1(a)中为總?的?列(n=10),? 3.1(b)中为總后的?列。
rear
6
5
6
5
7
4 rear 7 a b
8 front
a 9b
10
f
e 3
d c2 1
8 9
10
c4 d
3 e f2
1
(a)
front (b)
和出 ?操作ī~写算法,?在 情况?(r…) 出?。
解:先?立一个Η?列qu,g while 拨炒g?输入,若输入秨? 0, n 数入 ?;若阜 0,出?一个元素,?输出?;若悍 0,则?出拨。ef
算法r 下:
#include <stdio.h>
#include <malloc.h>
#define QueueSize 20
SqStack *ss;
ss=(SqStack *)malloc(sizeof(SqStack)); //栈初始化
ss->top=-1;
while (sq->front!=sq->rear)
//队不空时,出队并入栈
{
sq->front=(sq->front+1)%MaxSize;
if (sq->front==0)
typedef int ElemType;
typedef struct ququeue
{ ElemType data[QueueSize];
int front,rear; //队首和队尾指针
} SqQueue;
void main()
{ ElemType a,x;
SqQueue *qu;
//定义队列
qu=(SqQueue *)malloc(sizeof(SqQueue)); //队列初始化
for (i=0;i<MAXQNode;i++)
{ if (QH[i]!=NULL && first==1) //遇到第一个非空队列
{ head=QH[i];
//让 head 指向第一个数据结点
tail=QT[i];
first=0;
}
if (QH[i]!=NULL && first==0) //遇到其他非空队列
qu->rear=qu->front=0;
while (1)
{ printf("输入 a 值:");
scanf("%d",&a); if (a>0) { if ((qu->rear+1)%QueueSize==qu->front)
printf(" 队列满,不能入队\n"); else { qu->rear=(qu->rear+1)%QueueSize; //入队
//栈不空时,出栈并将元素入队
{
x=ss->data[ss->top];
ss->top--;
sq->rear=(sq->rear+1)%n;
sq->data[sq->rear]=x;
}
}
3.6 输入 n(由g?输入)个 10 以内的数,每输入 i(0≤i≤9),就把?插入? 第 i z ?列中。最后把 10 个?中非空?列,按?列z 柛媫的顺序串?成
(i=0;i<MAXQNode;i++)
QH[i]=QT[i]=NULL;
//置初值
Create(QH,QT);
//建立队列
Link(QH,QT);
}
//链接各队列并输出
一条h,?输出nh 的所有元素。
解:?立一个?列ⅲ点指针数组QH 和?列尾?点指针数组QT,先 ? 们所有元素 ?为NULL。对? 输入的 x,采g 尾插法 其h? QT[x]之后。最
后 ?们?个h 趁i。 对应的算法r 下:
#include <stdio.h>
#include <malloc.h>
#define MAXQNode 10 //队列的个数
typedef struct node
{ int data;
struct node *next;
} QNode;
void Insert(QNode *QH[],QNode *QT[],int x) //将 x 插入到相应队列中
{
QNode *s;
InitStack(ls);
for (i=0;i<n;i++)
{ if (A[i]=='I')
//入栈
Push(ls,A[i]);
else if (A[i]=='O') //出栈
{ if (StackEmpty(s))
return 0;
//栈空时返回 0
else
Pop(ls,x);
}
else return 0; //其他值无效退出
s=(QNode *)malloc(sizeof(QNode)); //创建一个结点
s->data=x;s->next=NULL;
if (QH[x]==NULL)
//对应的队列为空队时
{ QH[x]=s;
QT[x]=s;
}
else
{ QT[x]->next=s;
//将*s 结点链到 QT[x]所指结点
(1)下面所示的序列中哪些是合法的? A.IOIIOIOO B.IOOIOIIO C.IIIOIOIO D.IIIOOIOO
(2)通过对(1)的分析,写出一个算法判定所给的操作序列是否合法。 若合法返回 1; 否则返回 0。(假设被判定的操作序列已存入一维数组中)。
解:(1)A、D 均合法,而B、C 不合法。因为在B 中,先入栈一次,立即 出栈三次,这 会造成栈下溢。在C 中共入栈五次,出栈三次,栈的终态不为
'(',则 憭,否则以不 对返回 0;妺']',若栈?是'[',则
憭,否则以不 对返
回 0;妺'}',若栈?是'{',则 憭,否则以不 对返回 0。在exp 厗摂,若栈不
空,则以不 对返回 0;否则以yz 对返回 1。ef 算法r 下:?
int Match(char exp[],int n)
{ char st[MaxSize];
QT[x]=s;
之后 //让 QT[x]仍指向尾结点
}
}
void Create(QNode *QH[],QNode *QT[]) //根据用户输入创建队列
{ int n,x,i;
printf("n:");
scanf("%d",&n);
for (i=0;i<n;i++)
{ do
{ printf("输入第%d 个数:",i+1);
scanf("%d",&x);
} while (x<0 || x>10);
Insert(QH,QT,x);
}
}
void Link(QNode *QH[],QNode *QT[])
//将非空队列链接起来并输出
{ QNode *head,*tail;
//总链表的首结点指针和尾结点指针
int first=1,i;
(2)ef 使g 一个h 栈i 判j 操作序列是否合法,其中A 为存k 操作序
列的lm 数组,
n 为n 数组的元素个数(这o 的 ElemType pq 设定为 char)。对应的算法r 下:
int judge(char A[],int n)
{ int i;
ElemType x;
LiStack *ls;
(1)B 出栈,A 出栈,E 入栈,E 出栈,输出序列为 CDBAE; (2)B 出栈,E 入栈,E 出栈,A 出栈,输出序列为 CDBEA; (3)E 入栈,E 出栈,B 出栈,A 出栈,输出序列为 CDEBA。 所以可能的次序有:CDBAE、CDBEA、CDEBA。
3.2 假设以 I 和 O 分别表示入栈和出栈操作,栈的初态和终栈均为空,入 栈和出栈的操 作序列可表示为仅由I 和 O 组成的序列。
if (st[top]=='{') top--;
else tag=0;
i++;
}Baidu Nhomakorabea
if (top>=0) tag=0; //若栈不空,则不配对
return(tag);
}
3.4 设枟?输入一?数序列 a1,a2,...an,殈洔 :? ai>0 ?,ai ?,? ai<0 ?, 、元素出?,? ai=0 ?,表示输入¥。要? ?列憭成Η?列,入?
{ tail->next=QH[i];
tail=QT[i];
}
}
printf("\n 输出所有元素:");
while (head!=NULL)
{ printf("%d ",head->data);
head=head->next;
}
printf("\n");
}
void main()
{ int i;
QNode *QH[MAXQNode],*QT[MAXQNode]; //各队列的队头 QH 和队尾指针 QT for
数据结构教程李春葆第 3 章(第 4 版)—课后答案
3.1 有5 个元素,其入栈次序为:A、B、C、D、E,在各种可能的出栈次 序中,以元素 C、D 最先出栈(即C 第一个且D 第二个出栈)的次序有哪几个?
答:要使C 第一个且D 第二个出栈,应是A 入栈,B 入栈,C 入栈,C 出栈, D 入栈,D 出 栈,之后可以有以下几种情况:
图 3.1 环形队列
解:使g 一个栈脣过?的作g。先 sq?列中元素出— 其入栈ss,艐? 列空为 ?;?后初壬?列, sq->front 和sq->rear 均?为0;再出栈元素? 其入?
列,艐栈空 为?。对应的算法r 下:
void Reverse(SqQueue *&sq)
{ ElemType x;
qu->data[qu->rear]=a; } } else if (a<0) { if (qu->rear==qu->front)
printf(" 队列空,不能出队\n"); else { qu->front=(qu->front+1)%QueueSize; //出队
x=qu->data[qu->front]; printf(" 出队元素:%d\n",x); } } else break; } }
//队列元素下标从 1 到 n
sq->front=n;
x=sq->data[sq->front];
ss->top++;ss->data[ss->top]=x; //将 x 入栈
} //sq 栈中从栈顶到栈底的元素为:f,e,d,c,b,a
sq->front=sq->rear=0;
//队列初始化
while (ss->top>=0)
if (st[top]=='(') top--;
else tag=0;
if (exp[i]==']') //遇到']',若栈顶是'[',则继续处理,否则以不配对返回
if (st[top]=='[') top--;
else tag=0;
if (exp[i]=='}') //遇到'}',若栈顶是'{',则继续处理,否则以不配对返回
}
return (StackEmpty(ls)); //栈为空时返回 1;否则返回 0
}
3.3 假设表st 中uvwx 3 种yz:{yz、|yz 和}yz。~写一个算法判j 表
st 中的yz 是否 € 对。
解:设?一个栈 儎,厗表st 噲?,妺'('、'['?'{',则 其入栈;妺')',若栈?是
int top=-1,i=0,tag=1;
while (i<n && tag==1)
{
if (exp[i]=='(' || exp[i]=='[' || exp[i]=='{')
//遇到'('、'['或'{',则将其入栈
{
top++;
st[top]=exp[i];
}
if (exp[i]==')') //遇到')',若栈顶是'(',则继续处理,否则以不配对返回
3.5 ~写一个算法, 一个Η?列(冀为 n,元素下緰 1 ? n)的元素總。?r,? 3.1(a)中为總?的?列(n=10),? 3.1(b)中为總后的?列。
rear
6
5
6
5
7
4 rear 7 a b
8 front
a 9b
10
f
e 3
d c2 1
8 9
10
c4 d
3 e f2
1
(a)
front (b)
和出 ?操作ī~写算法,?在 情况?(r…) 出?。
解:先?立一个Η?列qu,g while 拨炒g?输入,若输入秨? 0, n 数入 ?;若阜 0,出?一个元素,?输出?;若悍 0,则?出拨。ef
算法r 下:
#include <stdio.h>
#include <malloc.h>
#define QueueSize 20
SqStack *ss;
ss=(SqStack *)malloc(sizeof(SqStack)); //栈初始化
ss->top=-1;
while (sq->front!=sq->rear)
//队不空时,出队并入栈
{
sq->front=(sq->front+1)%MaxSize;
if (sq->front==0)
typedef int ElemType;
typedef struct ququeue
{ ElemType data[QueueSize];
int front,rear; //队首和队尾指针
} SqQueue;
void main()
{ ElemType a,x;
SqQueue *qu;
//定义队列
qu=(SqQueue *)malloc(sizeof(SqQueue)); //队列初始化
for (i=0;i<MAXQNode;i++)
{ if (QH[i]!=NULL && first==1) //遇到第一个非空队列
{ head=QH[i];
//让 head 指向第一个数据结点
tail=QT[i];
first=0;
}
if (QH[i]!=NULL && first==0) //遇到其他非空队列
qu->rear=qu->front=0;
while (1)
{ printf("输入 a 值:");
scanf("%d",&a); if (a>0) { if ((qu->rear+1)%QueueSize==qu->front)
printf(" 队列满,不能入队\n"); else { qu->rear=(qu->rear+1)%QueueSize; //入队
//栈不空时,出栈并将元素入队
{
x=ss->data[ss->top];
ss->top--;
sq->rear=(sq->rear+1)%n;
sq->data[sq->rear]=x;
}
}
3.6 输入 n(由g?输入)个 10 以内的数,每输入 i(0≤i≤9),就把?插入? 第 i z ?列中。最后把 10 个?中非空?列,按?列z 柛媫的顺序串?成
(i=0;i<MAXQNode;i++)
QH[i]=QT[i]=NULL;
//置初值
Create(QH,QT);
//建立队列
Link(QH,QT);
}
//链接各队列并输出
一条h,?输出nh 的所有元素。
解:?立一个?列ⅲ点指针数组QH 和?列尾?点指针数组QT,先 ? 们所有元素 ?为NULL。对? 输入的 x,采g 尾插法 其h? QT[x]之后。最
后 ?们?个h 趁i。 对应的算法r 下:
#include <stdio.h>
#include <malloc.h>
#define MAXQNode 10 //队列的个数
typedef struct node
{ int data;
struct node *next;
} QNode;
void Insert(QNode *QH[],QNode *QT[],int x) //将 x 插入到相应队列中
{
QNode *s;
InitStack(ls);
for (i=0;i<n;i++)
{ if (A[i]=='I')
//入栈
Push(ls,A[i]);
else if (A[i]=='O') //出栈
{ if (StackEmpty(s))
return 0;
//栈空时返回 0
else
Pop(ls,x);
}
else return 0; //其他值无效退出
s=(QNode *)malloc(sizeof(QNode)); //创建一个结点
s->data=x;s->next=NULL;
if (QH[x]==NULL)
//对应的队列为空队时
{ QH[x]=s;
QT[x]=s;
}
else
{ QT[x]->next=s;
//将*s 结点链到 QT[x]所指结点
(1)下面所示的序列中哪些是合法的? A.IOIIOIOO B.IOOIOIIO C.IIIOIOIO D.IIIOOIOO
(2)通过对(1)的分析,写出一个算法判定所给的操作序列是否合法。 若合法返回 1; 否则返回 0。(假设被判定的操作序列已存入一维数组中)。
解:(1)A、D 均合法,而B、C 不合法。因为在B 中,先入栈一次,立即 出栈三次,这 会造成栈下溢。在C 中共入栈五次,出栈三次,栈的终态不为
'(',则 憭,否则以不 对返回 0;妺']',若栈?是'[',则
憭,否则以不 对返
回 0;妺'}',若栈?是'{',则 憭,否则以不 对返回 0。在exp 厗摂,若栈不
空,则以不 对返回 0;否则以yz 对返回 1。ef 算法r 下:?
int Match(char exp[],int n)
{ char st[MaxSize];
QT[x]=s;
之后 //让 QT[x]仍指向尾结点
}
}
void Create(QNode *QH[],QNode *QT[]) //根据用户输入创建队列
{ int n,x,i;
printf("n:");
scanf("%d",&n);
for (i=0;i<n;i++)
{ do
{ printf("输入第%d 个数:",i+1);
scanf("%d",&x);
} while (x<0 || x>10);
Insert(QH,QT,x);
}
}
void Link(QNode *QH[],QNode *QT[])
//将非空队列链接起来并输出
{ QNode *head,*tail;
//总链表的首结点指针和尾结点指针
int first=1,i;