栈和队列的基本操作的实现Word格式文档下载.docx
- 文档编号:17175309
- 上传时间:2022-11-28
- 格式:DOCX
- 页数:20
- 大小:83.15KB
栈和队列的基本操作的实现Word格式文档下载.docx
《栈和队列的基本操作的实现Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《栈和队列的基本操作的实现Word格式文档下载.docx(20页珍藏版)》请在冰豆网上搜索。
stdio.h>
malloc.h>
process.h>
#defineSTACKINITISIZE100
#defineSTACKINCREMENT10
#defineOK1
#defineERROR0
#defineOVERFLOW-2
typedefintSElemtype;
typedefintstatus;
typedefstruct{
SElemtype*base;
SElemtype*top;
intstacksize;
}sqstack;
voidInitstack(sqstack*s){
(*s).base=(SElemtype*)malloc(STACKINITISIZE*sizeof(SElemtype));
if(!
(*s).base)exit(OVERFLOW);
(*s).top=(*s).base;
(*s).stacksize=STACKINITISIZE;
}
voidpush(sqstack*s,SElemtypee){
if((*s).top-(*s).base>
=(*s).stacksize){
(*s).base=(SElemtype*)realloc((*s).base,((*s).stacksize+STACKINCREMENT)*sizeof(SElemtype));
if(!
(*s).base)
exit(OVERFLOW);
(*s).top=(*s).base+(*s).stacksize;
(*s).stacksize+=STACKINCREMENT;
*(*s).top++=e;
statusGettop(sqstacks){
inte;
if(s.top==s.base)
returnERROR;
e=*(s.top-1);
printf("
栈顶元素是%d\n"
e);
returnOK;
statuspop(sqstack*s){
intf;
if((*s).top==(*s).base)returnERROR;
f=*(--(*s).top);
printf("
出栈元素是%d\n"
f);
voidstackTraverse(sqstacks){
SElemtype*p=s.base;
while(s.top>
p)
printf("
%d"
*p++);
printf("
\n"
);
voidmain(){
inth,k,e,i;
sqstackla;
printf("
构建一个空栈\n"
Initstack(&
la);
请输入栈内元素的个数\n"
scanf("
%d"
&
k);
请输入%d个元素\n"
k);
for(i=0;
i<
k;
i++){
scanf("
e);
push(&
la,e);
}
输出栈内所有元素\n"
stackTraverse(la);
fflush(stdin);
查找栈顶元素\n"
Gettop(la);
删除栈顶元素\n"
pop(&
插入一个元素\n"
请输入插入的元素值\n"
h);
push(&
la,h);
功能:
实现顺序栈的各种功能,如能建立空栈,实现栈的初始化,插入,删除栈顶元素等操作。
算法设计思想:
首先建立一个空栈,再实现栈的初始化,用一个主函数包涵栈的各种操作。
程序调式如下:
程序二:
链栈
//shuju3.cpp:
定义控制台应用程序的入口点。
#include"
stdafx.h"
#include<
typedefstructSNode{
intdata;
structSNode*next;
}SNode,*Sqstack;
voidCreatesqstack(Sqstack*l,intn){
inti;
Sqstacks;
*l=(Sqstack)malloc(sizeof(SNode));
(*l)->
next=NULL;
n);
for(i=n;
i>
0;
--i){
s=(Sqstack)malloc(sizeof(SNode));
scanf("
(s->
data));
s->
next=(*l)->
next;
(*l)->
next=s;
statusGetelem(Sqstack*l,int*e){
s=(*l)->
*e=s->
data;
头元素是%d\n"
*e);
returnOK;
statusinsertsqtack(Sqstackl,inte,intn){
Sqstackp,s;
p=l;
for(i=0;
n;
p=p->
s=(Sqstack)malloc(sizeof(SNode));
data=e;
p->
statusDeletesqstack(Sqstackl){
inth;
Sqstackp,q;
q=p->
next=q->
h=q->
删除的元素是%d"
h);
free(q);
voidsqstackTraverse(Sqstackl){
Sqstackp;
p=l->
while(p){
printf("
p->
data);
voidmain(){
inti,j,n,k,e;
Sqstackla;
请输入链栈的长度\n"
scanf("
n);
建立一个链栈\n"
Createsqstack(&
la,n);
输出各元素\n"
la="
sqstackTraverse(la);
fflush(stdin);
Getelem(&
la,&
插入新的栈顶元素\n"
insertsqtack(la,e,n);
Deletesqstack(la);
实现链栈的基本功能,如初始化,删除,插入,查找栈顶元素等。
利用单链表的形式建立一个链栈,定义一个结构体,利用指针指向,建立链栈的具有不同功能的函数(删除、插入、查找等),利用主函数合理安排顺序实现链栈操作。
调试情况如下:
程序三:
链队列
//SHUJU.cpp:
\\链队列的建立
typedefintQElemtype;
typedefstructQNode{
QElemtypedata;
structQNode*next;
}QNode,*Queueptr;
Queueptrfront;
Queueptrrear;
}LinkQueue;
statusInitQueue(LinkQueue&
Q){
Q.front=(Queueptr)malloc(sizeof(QNode));
Q.rear=Q.front;
if(!
Q.front)
exit(OVERFLOW);
Q.front->
statusDestoryQueue(LinkQueue&
while(Q.front){
Q.rear=Q.front->
free(Q.front);
Q.front=Q.rear;
statusEnQueue(LinkQueue&
Q,QElemtypee){
Queueptrp;
p=(Queueptr)malloc(sizeof(QNode));
p)
data=e;
Q.rear->
next=p;
Q.rear=p;
statusDeQueue(LinkQueue&
Q,QElemtype&
e){
Queueptrp;
if(Q.front==Q.rear)
returnERROR;
p=Q.front->
e=p->
Q.front->
next=p->
if(Q.rear==p)
Q.rear=Q.front;
free(p);
statusGethead(LinkQueue&
Queueptrp;
QElemtypee;
if(Q.front==Q.rear)
头元素是%d"
returnOK;
statusQueueqTraverse(LinkQueueQ){
p=Q.front->
while(p){
}
LinkQueuela;
QElemtypee,k;
inth,i;
构建一个空队列\n"
InitQueue(la);
请输入元素个数\n"
h;
EnQueue(la,e);
输出队列内的元素\n"
QueueqTraverse(la);
获得对列的头元素\n"
Gethead(la);
开始插入一元素\n"
请输入插入元素\n"
EnQueue(la,k);
删除对头的元素\n"
DeQueue(la,e);
删除的元素是%d\n"
摧毁队列\n"
DestoryQueue(la);
实现链队列的各种不同的操作,如队列的初始化,队列的插入,删除,查询以及摧毁队列等。
构建两个不同的结构体,如下:
其中有指向头和尾的front和rear指针,利用它们构建链队列。
调试情况如下:
程序四:
循环队列
//shujiu4.cpp:
#defineMAXSIZE10
QElemtype*base;
intfront;
intrear;
}sqQueue;
statusInitQueue(sqQueue&
Q.base=(QElemtype*)malloc(MAXSIZE*sizeof(QElemtype));
Q.base)
Q.front=Q.rear=0;
statusQueueLength(sqQueueQ){
QElemtypex;
x=(Q.rear-Q.front+MAXSIZE)%MAXSIZE;
队列的元素个数是%d"
x);
statusEnQueue(sqQueue&
if((Q.rear+1)%MAXSIZE==Q.front)
Q.base[Q.rear]=e;
Q.rear=(Q.rear+1)%MAXSIZE;
statusDeQueue(sqQueue&
QElemtypee;
if(Q.front==Q.rear)
e=Q.base[Q.front];
Q.front=(Q.front+1)%MAXSIZE;
statusGetQueue(sqQueue&
statusQueueTraverse(sqQueue&
Q,intk){
QElemtypeh,i;
i=Q.front;
for(;
k>
k--){
h=Q.base[Q.front];
Q.front=(Q.front+1)%MAXSIZE;
Q.front=i;
sqQueuela;
QElemtypes,g,x,e;
intk,i;
请输入各元素的值\n"
s);
EnQueue(la,s);
输出队列内元素\n"
QueueTraverse(la,k);
QueueLength(la);
获得队列头元素\n"
GetQueue(la);
请输入插入元素的值\n"
g);
EnQueue(la,g);
k=k+1;
k=k-1;
删除头元素\n"
DeQueue(la);
能够充分利用结点,实现队列的各种基本功能。
为了充分利用空间,利用循环结构实现队列功能。
实验总结:
通过这次实验更加的清楚了栈和队列的各种操作,也更加深刻的认识到了指针,函数,结构体之间的联系与运用。
实验中也遇到了一些操作问题,但经过编程,调试,清楚的认识到了个人不足,仍需努力。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 队列 基本 操作 实现
![提示](https://static.bdocx.com/images/bang_tan.gif)