习题三和上机答案上课讲义Word文档下载推荐.docx
《习题三和上机答案上课讲义Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《习题三和上机答案上课讲义Word文档下载推荐.docx(17页珍藏版)》请在冰豆网上搜索。
![习题三和上机答案上课讲义Word文档下载推荐.docx](https://file1.bdocx.com/fileroot1/2022-10/27/2da0fb64-ba59-42aa-87c2-0c37070ceb6c/2da0fb64-ba59-42aa-87c2-0c37070ceb6c1.gif)
顺序表:
#include"
stdio.h"
#defineDataTypechar
#definesqstack_maxsize40
typedefstructsqstack
{DataTypedata[sqstack_maxsize];
inttop;
}SqStackTp;
intInitStack(SqStackTp*sq)
{sq->
top=0;
return
(1);
}
intPush(SqStackTp*sq,DataTypex)
{
if(sq->
top==sqstack_maxsize-1)
{printf("
栈满"
);
return(0);
else
{sq->
top++;
sq->
data[sq->
top]=x;
}
intPop(SqStackTp*sq,DataType*x)
if(sq->
top==0){printf("
下溢"
else{*x=sq->
top];
top--;
intEmptyStack(SqStackTp*sq)
top==0)return
(1);
elsereturn(0);
/*主函数*/
voidmain()
{SqStackTpsq;
DataTypech;
InitStack(&
sq);
for(ch='
A'
;
ch<
='
+12;
ch++)
{Push(&
sq,ch);
printf("
%c"
ch);
printf("
\n"
while(!
EmptyStack(&
sq))
{Pop(&
sq,&
ch);
printf("
}
链表:
#definedatatypechar
#definesizesizeof(structnode)
typedefstructnode
{datatypedata;
structnode*next;
}*LStackTp;
voidInitStack(LStackTp*ls)
*ls=NULL;
voidPush(LStackTp*ls,datatypex)
{LStackTpp;
p=(LStackTp)malloc(size);
p->
data=x;
next=*ls;
*ls=p;
intPop(LStackTp*ls,datatype*x)
if((*ls)!
=NULL)
{p=*ls;
*x=p->
data;
*ls=(*ls)->
next;
free(p);
return
(1);
}elsereturn(0);
intEmptyStack(LStackTpls)
if(ls==NULL)return
(1);
{LStackTpls;
datatypech;
InitStack(ls);
ls,ch);
ls->
data);
EmptyStack(ls))
ls,&
}
⒊3有两个栈A,B这两个栈中分别存储这一个升序数列,现要求编写算法把这两个栈中的数合成一个升序队列
linkmerge(linka,linkb)
{linkh,s,m,n,t;
h=(cnode*)malloc(sizeof(cnode));
h->
next=NULL;
s=h;
m=a;
n=b;
while(m->
next&
&
n->
next)
{if(m->
next->
data<
data)
{t=m->
m->
next=t->
t->
next=s->
s->
next=t;
s=t;
elseif(m->
data==n->
n=n->
else
{t=n->
n->
while(n->
free(m);
free(n);
returnh;
⒊4设两个栈共享一个数组空间,其类型定义见⒊⒈2节,试写出两个栈公用的读栈顶元算法elemtptop_dustack(dustacktpds,p;
inti);
进栈操作算法voidpush_dustack(dustacktpds,p;
inti,elemtpx);
及出栈算法elemtppop_dustack(dustacktpds,p;
inti)。
其中i的取值是1或2,用以指示栈号。
读栈顶元函数
elemtptop_sqstack(s:
sqstacktp){
if(s.top==0)
return(null);
return(s.elem[s.top]);
进栈操作
voidpush_sqstack(sqstacktps,elemtpx){
若栈s未满,将元素x压入栈中;
否则,栈的状态不变并给出出错信息
if(s.top==maxsize)
printf(“Overflow”);
else{
s.top++;
栈顶指针加1
s.elem[s.top]=xx进栈
出栈函数
elemtppop_sqstack(sqstacktps){
若栈s不空,则删去栈顶元素并返回元素值,否则返回空元素NULL
if(s.top==0)
s.top--;
栈顶指针减1
teturn(s.elem[s.top+1]);
返回原栈顶元素值
⒊5假设以数组sequ(0..m-1)存放循环队列元素,同时设变量rear和quelen分别指示循环队列中队尾元素和内含元素的个数。
试给出此循环队列的队满条件,并写出相应的入队列和出队列的算法(在出队列的算法中要返回队头元素)。
队满的条件
(sq.rear+1)MODmaxsize=sq.front
入队列操作
voiden_cqueue(cqueuetpcq,elemtpx){
若循环队列cq未满,插入x为新的队尾元素;
否则队列状态不变并给出错误信息
if((cq.rear+1)MODmaxsize==cq.front)
cq.rear=(cq.rear+1)MODmaxsize;
cq.elem[cq.rear]=x
出队列函数
elemtpdl_cqueue(VARcq:
cqueuetp){
若循环队列cq不空,则删去队头元素并返回元素值;
否则返回空元素NULL
if(cq.front==cq.rear)
return(NULL);
cq.front=(cq.front+1)MODmaxsize;
return(cq.elem[cq.front]);
⒊6假设以带头结点的环形链表表示队列,并且只设一个指针指向队尾元素结点(注意不设头指针),试编写相应的初始化队列、入队列、出队列的算法。
初始化:
voidinit_lqueue(lqueuetplq){
设置一个空的链队列lq
new(lq.front);
lq.front->
next:
=NIL;
lq.rear=lq.front;
入队列操作:
PROCen_lqueue(V