数据结构教程第三版第三章课后习题答案

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

scanf("%d",&a); if (a>0) { if ((qu->rear+1)%QueueSize==qu->front)
printf(" 队列满,不能入队\n"); else { qu->rear=(qu->rear+1)%QueueSize; //入队
qu->data[qu->rear]=a; } } else if (a<0) { if (qu->rear==qu->front)
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);
{ 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
下:
#include <stdio.h>
#include <malloc.h>
#define QueueSize 20
typedef int ElemType;
typedef struct ququeue
{ ElemType data[QueueSize];
int front,rear; //队首和队尾指针
¡列,Å‹栈空 为Æ 。对应的算法r下:
void Reverse(SqQueue *&sq)
{ ElemType x;
SqStack *ss; ss=(SqStack *)malloc(sizeof(SqStack)); // 栈 初 始 化
ss->top=-1;
while (sq->front!=sq->rear)
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) //遇到其他非空队列
后 ¹们™个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 插入到相应队列中
解:设‚一个栈 ƒ„,…†表st ‡ˆ‰,Š‹'('、'['Œ'{',则 其入栈;Š‹')',若栈Ž是
'(',则 ‘’,否则以不 对返回 0;Š‹']',若栈Ž是'[',则
‘’,否则以不 对返
回 0;Š‹'}',若栈Ž是'{',则 ‘’,否则以不 对返回 0。在exp …†“”,若栈不
空,则以不 对返回 0;否则以yz 对返回 1。ef算法r下:•
(i=0;i<MAXQNode;i++)
QH[i]=QT[i]=NULL;
//置初值
Create(QH,QT);
//建立队列
Link(QH,QT);
}
//链接各队列并输出
解:(1)A、D均合法,而B、C不合法。因为在B中,先入栈一次,立即出 栈三次,这 会造成栈下溢。在C中共入栈五次,出栈三次,栈的终态不为空。
(2)ef使g一个h栈i判j操作序列是否合法,其中A 为存k操作序列
的lm数组,
n 为n数组的元素个数(这o的 ElemType pq设定为 char)。对应的算法r下:
3.1 有5个元素,其入栈次序为:A、B、C、D、E,在各种可能的出栈次序 中,以元素 C、D最先出栈(即C第一个且D第二个出栈)的次序有哪几个?
答:要使C第一个且D第二个出栈,应是A入栈,B入栈,C入栈,C出栈,D 入栈,D出 栈,之后可以有以下几种情况:
(1)B出栈,A出栈,E入栈,E出栈,输出序列为CDBAE; (2)B出栈,E入栈,E出栈,A出栈,输出序列为CDBEA; (3)E入栈,E出栈,B出栈,A出栈,输出序列为CDEBA。 所以可能的次序有:CDBAE、CDBEA、CDEBA。
printf(" 队列空,不能出队\n"); else { qu->front=(qu->front+1)%QueueSize; //出队
x=qu->data[qu->front]; printf(" 出队元素:%d\n",x); } } else break; } }
3.5 ~写一个算法, 一个¦§¡列(¼½为 n,元素下¾– 1 ‹ n)的元素¿‚。 À r,Á 3.1(a)中为¿‚Â的¡列(n=10),Á 3.1(b)中为¿‚后的¡列。
{
QNode *s;
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]所指结点
} //sq 栈中从栈顶到栈底的元素为:f,e,d,c,b,a
sq->front=sq->rear=0;
//队列初始化
while (ss->top>=0)
//栈不空时,出栈并将元素入队
{
x=ss->data[ss->top];
ss->top--;
sq->rear=(sq->rear+1)%n;
sq->data[sq->rear]=x;
int judge(char A[],int n)
{ int i;
ElemType x;
LiStack *ls;
InitStack(ls);
for (i=0;i<n;i++)
{ if (A[i]=='I')
//入栈
Push(ls,A[i]);
else if (A[i]=='O')(s))
int Match(char exp[],int n)
{ char st[MaxSize];
int top=-1,i=0,tag=1;
while (i<n && tag==1)
{
if (exp[i]=='(' || exp[i]=='[' || exp[i]=='{')
//遇到'('、'['或'{',则将其入栈
//队不空时,出队并入栈
{
sq->front=(sq->front+1)%MaxSize;
if (sq->front==0)
//队列元素下标从 1 到 n
sq->front=n;
x=sq->data[sq->front];
ss->top++;ss->data[ss->top]=x; //将 x 入栈
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)
图 3.1 环形队列
解:使g一个栈Ë过Ä的作g。先 sq¡列中元素出¡ª其入栈ss,Å‹¡ 列空为 Æ ;Ç后初ÈÉ¡列, sq->front和sq->rear均‚为0;再出栈元素ª 其入
} SqQueue;
void main()
{ ElemType a,x;
SqQueue *qu;
//定义队列
qu=(SqQueue *)malloc(sizeof(SqQueue)); // 队 列 初 始 化
qu->rear=qu->front=0;
while (1)
{ printf("输入 a 值:");
return 0;
//栈空时返回 0
else
Pop(ls,x);
}
else return 0; //其他值无效退出
}
return (StackEmpty(ls)); //栈为空时返回 1;否则返回 0
}
3.3 假设表st中uvwx 3 种yz:{yz、|yz和}yz。~写一个算法判j表
st中的yz是否 € 对。
return(tag);
}
3.4 设–—˜输入一™数序列 a1,a2,...an,š~›œ :ž ai>0 Ÿ,ai ¡,ž ai<0 Ÿ, ¡¢元素出¡,ž ai=0 Ÿ,表示输入£¤。要¥ ¡列‘’成¦ §¡列,入¡
和出 ¡操作¨©~写算法,ª在«¬情况Ÿ(r¡-)®¯出°。
解:先±立一个¦ §¡列qu,g while ²¦ ³´gµ输入,若输入¶}· 0, n 数入 ¡;若¸· 0,出¡一个元素,ª输出¹;若º· 0,则»出²¦ 。ef算法r
if (st[top]=='[') top--;
else tag=0;
if (exp[i]=='}') //遇到'}',若栈顶是'{',则继续处理,否则以不配对返回
if (st[top]=='{') top--;
else tag=0;
i++;
}
if (top>=0) tag=0; //若栈不空,则不配对
3.2 假设以 I 和 O 分别表示入栈和出栈操作,栈的初态和终栈均为空,入 栈和出栈的操 作序列可表示为仅由I 和 O 组成的序列。
(1)下面所示的序列中哪些是合法的? A.IOIIOIOO B.IOOIOIIO C.IIIOIOIO D.IIIOOIOO
(2)通过对(1)的分析,写出一个算法判定所给的操作序列是否合法。 若合法返回 1; 否则返回 0。(假设被判定的操作序列已存入一维数组中)。
}
}
3.6 输入 n(由gµ输入)个 10 以内的数,每输入 i(0≤i≤9),就把¹插 入‹第 i z ¡列中。最后把 10 个¡中非空¡列,按¡列z–¸‹}的顺序串³成
一条h,ª输出nh 的所有元素。
解:±立一个¡列¢£点指针数组QH 和¡列尾£点指针数组QT,先 ¹ 们所有元素 ‚为NULL。对· 输入的 x,采g尾插法 其h‹ QT[x]之后。最
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;
{
top++;
st[top]=exp[i];
}
if (exp[i]==')') //遇到')',若栈顶是'(',则继续处理,否则以不配对返回
if (st[top]=='(') top--;
else tag=0;
if (exp[i]==']') //遇到']',若栈顶是'[',则继续处理,否则以不配对返回
相关文档
最新文档