ImageVerifierCode 换一换
格式:DOCX , 页数:31 ,大小:26.54KB ,
资源ID:8731391      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/8731391.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(栈的操作实验报告.docx)为本站会员(b****7)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

栈的操作实验报告.docx

1、栈的操作实验报告实验三 栈和队列3.1实验目的:(1)熟悉栈的特点先进后出及栈的基本操作,如入栈、出栈等,掌握栈的基本操作在栈的顺序存储结构和链式存储结构上的实现;(2)熟悉队列的特点先进先出及队列的基本操作,如入队、出队等,掌握队列的基本操作在队列的顺序存储结构和链式存储结构上的实现。3.2实验要求:(1)复习课本中有关栈和队列的知识;(2)用C语言完成算法和程序设计并上机调试通过;(3)撰写实验报告,给出算法思路或流程图和具体实现源程序、算法分析结果包括时间复杂度、空间复杂度以及算法优化设想、输入数据及程序运行结果必要时给出多种可能的输入数据和运行结果。3.3基础实验实验1 栈的顺序表示和

2、实现实验内容与要求:编写一个程序实现顺序栈的各种基本运算,并在此基础上设计一个主程序,完成如下功能:1初始化顺序栈2插入元素3删除栈顶元素4取栈顶元素5遍历顺序栈6置空顺序栈分析:栈的顺序存储结构简称为顺序栈,它是运算受限的顺序表。对于顺序栈,入栈时,首先判断栈是否为满,栈满的条件为:p-top= =MAXNUM-1,栈满时,不能入栈; 否则出现空间溢出,引起错误,这种现象称为上溢。出栈和读栈顶元素操作,先判栈是否为空,为空时不能操作,否则产生错误。通常栈空作为一种控制转移的条件。注意:1顺序栈中元素用向量存放2栈底位置是固定不变的,可设置在向量两端的任意一个端点3栈顶位置是随着进栈和退栈操作

3、而变化的,用一个整型量top通常称top为栈顶指针来指示当前栈顶位置参考程序:#include#include#define MAXNUM 20#define ElemType int/*定义顺序栈的存储结构*/typedef struct ElemType stackMAXNUM; int top;SqStack;/*初始化顺序栈*/void InitStack(SqStack *p) if(!p) printf(Eorror); p-top=-1;/*入栈*/void Push(SqStack *p,ElemType x) if(p-toptop=p-top+1; p-stackp-top

4、=x; else printf(Overflow!n);/*出栈*/ElemType Pop(SqStack *p) ElemType x; if(p-top!=0) x=p-stackp-top; printf(以前的栈顶数据元素%d已经被删除!n,p-stackp-top); p-top=p-top-1; return(x); else printf(Underflow!n); return(0); /*获取栈顶元素*/ElemType GetTop(SqStack *p) ElemType x; if(p-top!=0) x=p-stackp-top; return(x); else p

5、rintf(Underflow!n); return(0); /*遍历顺序栈*/void OutStack(SqStack *p) int i; printf(n); if(p-toptop;i=0;i-) printf(第%d个数据元素是:%6dn,i,p-stacki);/*置空顺序栈*/void setEmpty(SqStack *p)p-top= -1;/*主函数*/main() SqStack *q; int y,cord;ElemType a; do printf(n); printf(第一次使用必须初始化!n); printf(n); printf(n 主菜单 n); print

6、f(n 1 初始化顺序栈 n); printf(n 2 插入一个元素 n); printf(n 3 删除栈顶元素 n); printf(n 4 取栈顶元素 n); printf(n 5 置空顺序栈 n); printf(n 6 结束程序运行 n); printf(n-n); printf(请输入您的选择( 1, 2, 3, 4, 5,6); scanf(%d,&cord); printf(n); switch(cord) case 1: q=(SqStack*)malloc(sizeof(SqStack); InitStack(q); OutStack(q); break; case 2: p

7、rintf(请输入要插入的数据元素:a=); scanf(%d,&a); Push(q,a); OutStack(q); break; case 3: Pop(q); OutStack(q); break; case 4: y=GetTop(q); printf(n栈顶元素为:%dn,y); OutStack(q); break; case 5: setEmpty(q); printf(n顺序栈被置空!n); OutStack(q); break; case 6: exit(0); while (cordtop=NULL; printf(n已经初始化链栈!n);/*链栈置空*/void set

8、Empty(LinkStack * s) s-top=NULL; printf(n链栈被置空!n);/*入栈*/void pushLstack(LinkStack * s, Elemtype x) StackNode * p; p=(StackNode *)malloc(sizeof(StackNode); /建立一个节点。 p-data=x; p-next=s-top; /由于是在栈顶pushLstack,所以要指向栈顶。 s-top=p; /插入/*出栈*/Elemtype popLstack(LinkStack * s) Elemtype x; StackNode * p; p=s-to

9、p; /指向栈顶 if (s-top =0) printf(n栈空,不能出栈!n); exit(-1); x=p-data; s-top=p-next; /当前的栈顶指向原栈的next free(p); /释放 return x;/*取栈顶元素*/Elemtype StackTop(LinkStack *s) if (s-top =0) printf(n链栈空n); exit(-1); return s-top-data;/*遍历链栈*/void Disp(LinkStack * s) printf(n链栈中的数据为:n); printf(=n); StackNode * p; p=s-top

10、; while (p!=NULL) printf(%dn,p-data); p=p-next; printf(=n);void main() printf(= 链栈操作=nn); int i,m,n,a; LinkStack * s; s=(LinkStack *)malloc(sizeof(LinkStack); int cord; do printf(n); printf(第一次使用必须初始化!n); printf(n); printf(n 主菜单 n); printf(n 1 初始化链栈 n); printf(n 2 入栈 n); printf(n 3 出栈 n); printf(n 4

11、 取栈顶元素 n); printf(n 5 置空链栈 n); printf(n 6 结束程序运行 n); printf(n-n); printf(请输入您的选择( 1, 2, 3, 4, 5,6); scanf(%d,&cord); printf(n); switch(cord) case 1: InitStack(s); Disp(s); break; case 2: printf(输入将要压入链栈的数据的个数:n=); scanf(%d,&n); printf(依次将%d个数据压入链栈:n,n); for(i=1;i=n;i+) scanf(%d,&a); pushLstack(s,a);

12、 Disp(s); break; case 3: printf(n出栈操作开始!n); printf(输入将要出栈的数据个数:m=); scanf(%d,&m); for(i=1;i=m;i+) printf(n第%d次出栈的数据是:%d,i,popLstack(s); Disp(s); break; case 4: printf(nn链栈的栈顶元素为:%dn,StackTop(s); printf(n); break; case 5: setEmpty(s); Disp(s); break; case 6: exit(0); while (cord=6);实验3 队列的顺序表示和实现实验内容

13、与要求编写一个程序实现顺序队列的各种基本运算,并在此基础上设计一个主程序,完成如下功能:1初始化队列2建立顺序队列3入队4出队5判断队列是否为空6取队头元素7遍历队列分析:队列的顺序存储结构称为顺序队列,顺序队列实际上是运算受限的顺序表。入队时,将新元素插入rear所指的位置,然后将rear加1。出队时,删去front所指的元素,然后将front加1并返回被删元素。顺序队列中的溢出现象:1 下溢现象。当队列为空时,做出队运算产生的溢出现象。“下溢”是正常现象,常用作程序控制转移的条件。2 真上溢现象。当队列满时,做进栈运算产生空间溢出的现象。“真上溢”是一种出错状态,应设法防止。3 假上溢现象

14、。由于入队和出队操作中,头尾指针只增加不减小,致使被删元素的空间永远无法重新利用。当队列中实际的元素个数远远小于向量空间的规模时,也可能由于尾指针已超越向量空间的上界而不能做入队操作。该现象称为假上溢现象。注意:1当头尾指针相等时,队列为空。2在非空队列里,队头指针始终指向队头元素,尾指针始终指向队尾元素的下一位置。参考程序:#include #include #define MAXNUM 100#define Elemtype int#define TRUE 1#define FALSE 0typedef struct Elemtype queueMAXNUM; int front; int

15、 rear;sqqueue; /*队列初始化*/int initQueue(sqqueue *q) if(!q) return FALSE; q-front=-1; q-rear=-1; return TRUE; /*入队*/int append(sqqueue *q, Elemtype x) if(q-rear=MAXNUM-1) return FALSE; q-rear+; q-queueq-rear=x; return TRUE;/*出队*/Elemtype Delete(sqqueue *q) Elemtype x; if (q-front=q-rear) return 0; x=q-

16、queue+q-front; return x;/*判断队列是否为空*/int Empty(sqqueue *q) if (q-front=q-rear) return TRUE; return FALSE; /*取队头元素*/int gethead(sqqueue *q) if (q-front=q-rear) return 0; return(q-queueq-front+1); /*遍历队列*/void display(sqqueue *q) int s; s=q-front; if (q-front=q-rear) printf(队列空!n); else printf(n顺序队列依次为

17、:); while(srear) s=s+1; printf(%dqueues); printf(n); printf(顺序队列的队尾元素所在位置:rear=%dn,q-rear); printf(顺序队列的队头元素所在位置:front=%dn,q-front); /*建立顺序队列*/void Setsqqueue(sqqueue *q) int n,i,m; printf(n请输入将要入顺序队列的长度:); scanf(%d,&n); printf(n请依次输入入顺序队列的元素值:n); for (i=0;in;i+) scanf(%d,&m); append(q,m); main() sq

18、queue *head; int x,y,z,select; head=(sqqueue*)malloc(sizeof(sqqueue); doprintf(n第一次使用请初始化!n); printf(n请选择操作(1-7):n); printf(=n); printf(1 初始化n); printf(2 建立顺序队列n); printf(3 入队n); printf(4 出队 n); printf(5 判断队列是否为空n); printf(6 取队头元素 n); printf(7 遍历队列n); printf(=n); scanf(%d,&select); switch(select) ca

19、se 1: initQueue(head); printf(已经初始化顺序队列!n); break; case 2: Setsqqueue(head); printf(n已经建立队列!n); display(head); break; case 3: printf(请输入队的值:n ); scanf(%d,&x); append(head,x); display(head); break; case 4: z=Delete(head); printf(n队头元素%d已经出队!n,z); display(head); break; case 5: if(Empty(head) printf(队列

20、空n); else printf(队列非空n); break; case 6: y=gethead(head); printf(队头元素为:%dn,y); break; case 7: display(head); break; while(select=7); 实验4 队列的链式表示和实现实验内容与要求:编写一个程序实现链队列的各种基本运算,并在此基础上设计一个主程序,完成如下功能:1初始化并建立链队列2入链队列3出链队列4遍历链队列分析:队列的链式存储结构简称为链队列。它是限制仅在表头删除和表尾插入的单链表。注意:1和链栈类似,无须考虑判队满的运算及上溢。2在出队算法中,一般只需修改队头指

21、针。但当原队中只有一个结点时,该结点既是队头也是队尾,故删去此结点时亦需修改尾指针,且删去此结点后队列变空。3和单链表类似,为了简化边界条件的处理,在队头结点前可附加一个头结点。参考程序:#include#include#define ElemType inttypedef struct Qnode ElemType data; struct Qnode *next;Qnodetype;typedef struct Qnodetype *front; Qnodetype *rear;Lqueue;/*入链队列*/void Lappend(Lqueue *q,int x) Qnodetype *

22、s; s=(Qnodetype*)malloc(sizeof(Qnodetype); s-data=x; s-next=NULL; q-rear-next=s; q-rear=s;/*初始化并建立链队列*/void creat(Lqueue *q) Qnodetype *h; int i,n,x; printf(输入将建立链队列元素的个数:n= ); scanf(%d,&n); h=(Qnodetype*)malloc(sizeof(Qnodetype); h-next=NULL; q-front=h; q-rear=h; for(i=1;ifront=q-rear) printf(队列为空!n); x=0; else p=q-front-next; q-front-next=p-next; if(p-next=NULL) q-rear=q-front; x=p-data; free(p); return(x);/*遍历链队列*/void display(Lqueue *q) Qnodetype *p; p=q-front-next; /*指向第一个数据元素节点 */ printf(n链队列元素依次为:); while(p!=NULL) printf(%d-,p-data); p=p-next; printf(nn遍历链队列结束! n);

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

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