堆栈和队列基本函数.docx

上传人:b****5 文档编号:11983824 上传时间:2023-04-16 格式:DOCX 页数:22 大小:17.63KB
下载 相关 举报
堆栈和队列基本函数.docx_第1页
第1页 / 共22页
堆栈和队列基本函数.docx_第2页
第2页 / 共22页
堆栈和队列基本函数.docx_第3页
第3页 / 共22页
堆栈和队列基本函数.docx_第4页
第4页 / 共22页
堆栈和队列基本函数.docx_第5页
第5页 / 共22页
点击查看更多>>
下载资源
资源描述

堆栈和队列基本函数.docx

《堆栈和队列基本函数.docx》由会员分享,可在线阅读,更多相关《堆栈和队列基本函数.docx(22页珍藏版)》请在冰豆网上搜索。

堆栈和队列基本函数.docx

堆栈和队列基本函数

一.顺序栈

1.宏定义

#include

#include

#defineMAXSIZE****

#definedatatype****

2.结构体

typedefstruct

{

datatypedata[MAXSIZE];

inttop;

}Seqstack;

3.基本函数

Seqstack*Init_Seqstack()

/*置空栈函数(初始化)1.先决条件:

无;2.函数作用:

首先建立栈空间,然后初始化栈顶指针,返回栈s的地址*/

{

Seqstack*s;

s=(Seqstack*)malloc(sizeof(Seqstack));

s->top=-1;

returns;

}

intEmpty_Seqstack(Seqstack*s)

/*判栈空函数1.先决条件:

初始化顺序栈;2.函数作用:

判断栈是否为空,空返回1,不空返回0*/

{

if(s->top==-1)return1;

elsereturn0;

}

intPush_Seqstack(Seqstack*s,datatypex)

/*入栈函数1.先决条件:

初始化顺序栈2.函数作用:

将数据x入栈,栈满则不能,成功返回1,因栈满失败返回0*/

{

if(s->top==MAXSIZE-1)

return0;

s->top=s->top+1;

s->data[s->top]=x;

return1;

}

intPop_Seqstack(Seqstack*s,datatype*x)

/*出栈函数1.先决条件:

初始化顺序栈2.函数作用:

从栈中出一个数据,并将其存放到x中,成功返回1,因栈空失败返回0*/

{

if(s->top==-1)

return0;

*x=s->data[s->top];

s->top--;

return1;

}

intTop_Seqstack(Seqstack*s,datatype*x)

/*取栈顶元素函数1.先决条件:

初始化顺序栈2.函数作用:

取栈顶元素,并把其存放到x中,成功返回1,因栈空失败返回0*/

{

if(s->top==-1)

return0;

*x=s->data[s->top];

return1;

}

intPrintf_Seqstack(Seqstack*s)

/*遍历顺序栈函数1.先决条件:

初始化顺序栈2.函数作用:

遍历顺序栈,成功返回1*/

{

inti,j=0;

for(i=s->top;i>=0;i--)

{

printf("%d",s->data[i]);/*因datatype不同而不同*/

j++;

if(j%10==0)

printf("\n");

}

printf("\n");

return1;

}

intConversation_Seqstack(intN,intr)

/*数制转换函数(顺序栈)1.先决条件:

具有置空栈,入栈,出栈函数2.函数作用:

将N转换为r进制的数*/

{

Seqstack*s;

datatypex;

printf("%d转为%d进制的数为:

",N,r);/*以后可以删除去*/

s=Init_Seqstack();

do

{

Push_Seqstack(s,N%r);

N=N/r;

}while(N);

while(Pop_Seqstack(s,&x))

{

if(x>=10)/*为了能转为十进制以上的*/

printf("%c",x+55);

else

printf("%d",x);

}

free(s);/*释放顺序栈*/

printf("\n");

return1;

}

4.主函数

intmain()

{

Seqstack*s;

intchoice;

datatypex;

do{

printf("****************************************************************\n");

printf("1.置空栈2.判栈空3.入栈4.出栈5.取栈顶元素6.遍历7.退出\n");

printf("****************************************************************\n");

printf("请输入选择(1~7):

");

scanf("%d",&choice);

getchar();

switch(choice)

{

case1:

s=Init_Seqstack();

if(s)

printf("置空栈成功!

\n");break;

case2:

if(Empty_Seqstack(s))

printf("此为空栈.\n");

else

printf("此不为空栈.\n");;break;

case3:

printf("请输入一个整数:

");

scanf("%d",&x);

if(Push_Seqstack(s,x))

printf("入栈成功.\n");

else

printf("栈已满,无法入栈.\n");;break;

case4:

if(Pop_Seqstack(s,&x))

printf("出栈成功,出栈元素为:

%d\n",x);

else

printf("出栈失败,因栈为空.\n");break;

case5:

if(Top_Seqstack(s,&x))

printf("取栈顶元素成功,栈顶元素为:

%d\n",x);

else

printf("取栈顶元素失败,因栈为空.\n");

break;

case6:

Printf_Seqstack(s);break;

case7:

printf("谢谢使用!

\n");break;

default:

printf("输入错误,请重新输入!

\n");break;

}

}while(choice!

=7);

return0;

}

二.链栈

1.宏定义

#include

#include

#definedatatype****

2.结构体

typedefstructsnode

{

datatypedata;

structsnode*next;

}Stacknode,*Linkstack;

3.基本函数

LinkstackInit_Linkstack()

/*初始化栈函数1.先决条件:

无2.函数作用:

初始化链栈,返回top地址*/

{

Linkstacktop;

top=(Linkstack)malloc(sizeof(Stacknode));

top->next=NULL;

returntop;

}

intEmpty_Linkstack(Linkstacktop)

/*判栈空函数1.先决条件:

初始化链栈2.函数作用:

判断栈是否为空,空返回1,不空返回0*/

{

if(top->next==NULL)

return1;

elsereturn0;

}

intPush_Linkstack(Linkstacktop,datatypex)

/*入栈函数1.先决条件:

初始化链栈2.函数作用:

将数据x入栈,成功返回1,失败返回0*/

{

Stacknode*p;

p=(Stacknode*)malloc(sizeof(Stacknode));

p->data=x;

p->next=top->next;

top->next=p;

return1;

}

intPop_Linkstack(Linkstacktop,datatype*x)

/*出栈函数1.先决条件:

初始化链栈2.函数作用:

若栈空退出,若没空则将数据出栈,并将其存放到x中,成功返回1,因栈空失败返回0*/

{

if(top->next==NULL)

return0;

Stacknode*p=top->next;

*x=p->data;

top->next=p->next;

free(p);

return1;

}

intTop_Linkstack(Linkstacktop,datatype*x)

/*取栈顶元素函数1.先决条件:

初始化链栈2.函数作用:

取栈顶元素并放到x中,成功返回1,因栈空失败返回0*/

{

if(top->next==NULL)

return0;

*x=top->next->data;

return1;

}

intPrintf_Linkstack(Linkstacktop)

/*遍历链栈函数1.先决条件:

初始化链栈2.函数作用:

遍历链栈,成功返回1*/

{

Stacknode*p=top->next;

intj=0;

while(p)

{

printf("%d",p->data);/*因datatype不同而不同*/

j++;

if(j%10==0)

printf("\n");

p=p->next;

}

printf("\n");

return1;

}

intConversation_Linkstack(intN,intr)

/*数制转换函数(链栈)1.先决条件:

具有置空栈,入栈,出栈函数2.函数作用:

将N转换为r进制的数*/

{

Linkstacktop;

datatypex;

printf("%d转为%d进制的数为:

",N,r);/*以后可以删除去*/

top=Init_Linkstack();

do

{

Push_Linkstack(top,N%r);

N=N/r;

}while(N);

while(Pop_Linkstack(top,&x))

{

if(x>=10)/*为了能转为十进制以上的*/

printf("%c",x+55);

else

printf("%d",x);

}

printf("\n");

free(top);/*释放栈顶空间*/

return1;

}

4.主函数

intmain()

{

Linkstacktop;

intchoice;

datatypex;

do{

printf("****************************************************************\n");

printf("1.置空栈2.判栈空3.入栈4.出栈5.取栈顶元素6.遍历7.退出\n");

printf("****************************************************************\n");

printf("请输入选择(1~7):

");

scanf("%d",&choice);

getchar();

switch(choice)

{

case1:

top=Init_Linkstack();

if(top)

printf("置空栈成功!

\n");break;

case2:

if(Empty_Linkstack(top))

printf("此为空栈.\n");

else

printf("此不为空栈.\n");;break;

case3:

printf("请输入一个整数:

");

scanf("%d",&x);

if(Push_Linkstack(top,x))

printf("入栈成功.\n");

else

printf("栈已满,无法入栈.\n");;break;

case4:

if(Pop_Linkstack(top,&x))

printf("出栈成功,出栈元素为:

%d\n",x);

else

printf("出栈失败,因栈为空.\n");break;

case5:

if(Top_Linkstack(top,&x))

printf("取栈顶元素成功,栈顶元素为:

%d\n",x);

else

printf("取栈顶元素失败,因栈为空.\n");

break;

case6:

Printf_Linkstack(top);break;

case7:

printf("谢谢使用!

\n");break;

default:

printf("输入错误,请重新输入!

\n");break;

}

}while(choice!

=7);

return0;

}

三.顺序队列

1.宏定义

#include

#include

#defineMAXSIZE****

#definedatatype****

2.结构体

typedefstruct

{

datatypedata[MAXSIZE];

intrear,front;

intnum;

}Sequeue;

3.基本函数

Sequeue*Init_Sequeue()

/*初始化顺序队列函数1.先决条件:

无2.函数作用:

初始化顺序队列,成功返回顺序队列首地址q*/

{

Sequeue*q;

q=(Sequeue*)malloc(sizeof(Sequeue));

q->front=q->rear=MAXSIZE-1;

q->num=0;

returnq;

}

intIn_Sequeue(Sequeue*q,datatypex)

/*入队函数1.先决条件:

初始化顺序队列2.函数作用:

将数据x入队到q中,成功返回1,因队满失败返回0*/

{

if(q->num==MAXSIZE)

{

printf("队满.\n");/*可视情况删除此句*/

return0;

}

else

{

q->rear=(q->rear+1)%MAXSIZE;

q->data[q->rear]=x;

q->num++;

return1;

}

}

intFront_Sequeue(Sequeue*q,datatype*x)

/*取队头元素函数1.先决条件:

初始化顺序表2.函数作用:

取队头元素并将其存放到x中,成功返回1,因队空而失败返回0*/

{

if(q->num==0)

{

printf("队空.\n");/*可视情况删除此句*/

return0;

}

*x=q->data[q->front+1];

return1;

}

intOut_Sequeue(Sequeue*q,datatype*x)

/*出队函数1.先决条件:

初始化顺序队列2.函数作用:

将数据x入队到q中,成功返回1,因队空失败返回0*/

{

if(q->num==0)

{

printf("队空.\n");/*可视情况删除此句*/

return0;

}

else

{

q->front=(q->front+1)%MAXSIZE;

*x=q->data[q->front];

q->num--;

return1;

}

}

intEmpty_Sequeue(Sequeue*q)

/*判空函数1.先决条件:

初始化顺序队列2.函数作用:

是空返回1,非空返回0*/

{

if(q->num==0)

return1;

elsereturn0;

}

intPrintf_Sequeue(Sequeue*q)

/*遍历函数1.先决条件:

初始化顺序队列2.函数作用:

遍历输出所有数据*/

{

inti,j=q->front+1,n=q->num;

for(i=0;i

{

printf("%d",q->data[j]);/*因datatype数据不同而不同*/

j++;

j=j%MAXSIZE;

}

printf("\n");

return1;

}

4.主函数

intmain()

{

Sequeue*q;

intchoice;

datatypex;

do{

printf("**************************************************************\n");

printf("1.初始化2.判队空3.入队4.出队5.取队头元6.遍历7.退出\n");

printf("**************************************************************\n");

printf("请输入选择(1~7):

");

scanf("%d",&choice);

getchar();

switch(choice)

{

case1:

q=Init_Sequeue();

if(q)

printf("置空队成功!

\n");break;

case2:

if(Empty_Sequeue(q))

printf("此为空队.\n");

else

printf("此不为空队.\n");;break;

case3:

printf("请输入一个整数:

");

scanf("%d",&x);

if(In_Sequeue(q,x))

printf("入队成功.\n");

else

printf("队已满,无法入队.\n");;break;

case4:

if(Out_Sequeue(q,&x))

printf("出队成功,出队元素为:

%d\n",x);

else

printf("出队失败,因队为空.\n");break;

case5:

if(Front_Sequeue(q,&x))

printf("取队头元素成功,队头元素为:

%d\n",x);

else

printf("取队头元素失败,因队为空.\n");

break;

case6:

Printf_Sequeue(q);break;

case7:

printf("谢谢使用!

\n");break;

default:

printf("输入错误,请重新输入!

\n");break;

}

}while(choice!

=7);

return0;

}

四.链队列

1.宏定义

#include

#include

#definedatatypeint

2.结构体

typedefstructnode

{

datatypedata;

structnode*next;

}Qnode;

typedefstruct

{

Qnode*front,*rear;

}Lqueue;

3.基本函数

Lqueue*Init_Lqueue()

/*初始化链队列函数1.先决条件:

无2.函数作用:

初始化链队列,成功返回顺序队列首地址q(头结点)*/

{

Lqueue*q;

Qnode*p;

q=(Lqueue*)malloc(sizeof(Lqueue));

p=(Qnode*)malloc(sizeof(Qnode));

p->next=NULL;

q->front=p;

q->rear=p;

returnq;

}

intIn_Lqueue(Lqueue*q,datatypex)

/*入队函数1.先决条件:

初始化链队列2.函数作用:

将数据x入队到q中,成功返回1*/

{

Qnode*p;

p=(Qnode*)malloc(sizeof(Qnode));

p->data=x;

p->next=NULL;

q->rear->next=p;

q->rear=p;

return1;

}

intEmpty_Lqueue(Lqueue*q)

/*判空函数1.先决条件:

初始化链队列2.函数作用:

是空返回1,非空返回0*/

{

if(q->front==q->rear)

return1;

elsereturn0;

}

intFront_Lqueue(Lqueue*q,datatype*x)

/*取队头元素函数1.先决条件:

初始化链队列2.函数作用:

取队头元素并将其存放到x中,成功返回1,因队空而失败返回0*/

{

if(Empty_Lqueue(q))

{

printf("队空.\n");/*可视情况删除此句*/

return0;

}

*x=q->front->next->data;

return1;

}

intOut_Lqueue(Lqueue*q,datatype*x)

/*出队函数1.先决条件:

初始化链队列2.函数作用:

将数据x入队到q中,成功返回1,因队空失败返回0*/

{

Qnode*p;

if(Empty_Lqueue(q))

{

printf("队空.\n");/*可视情况删除此句*/

return0;

}

p=q->front->next;

*x=p->data;

q->front->next=p->next;

free(p);

if(q->front->next==NULL)

q->rear=q->front;

return1;

}

intPrintf_Lqueue(Lqueue*q)

/*遍历函数1.先决条件:

初始化链队列2.函数作用:

遍历输出所有数据*/

{

Qnode*p;

for(p=q->front->next;p!

=NULL;p=p->next)

printf("%d",p->data);/*因datatype数据不同而不同*/

printf("\n");

return1;

}

4.主函数

intmain()

{

Lqueue*q;

intchoice;

datatypex;

do{

printf("**************************************************************\n");

printf("1.初始化2.判队空3.入队4.出队5.取队头元6.遍

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 教学研究 > 教学反思汇报

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1