欢迎来到冰豆网! | 帮助中心 分享价值,成长自我!
冰豆网
全部分类
  • IT计算机>
  • 经管营销>
  • 医药卫生>
  • 自然科学>
  • 农林牧渔>
  • 人文社科>
  • 工程科技>
  • PPT模板>
  • 求职职场>
  • 解决方案>
  • 总结汇报>
  • 党团工作>
  • ImageVerifierCode 换一换
    首页 冰豆网 > 资源分类 > DOCX文档下载
    分享到微信 分享到微博 分享到QQ空间

    实验二 栈和队列基本操作.docx

    • 资源ID:23714399       资源大小:18.99KB        全文页数:21页
    • 资源格式: DOCX        下载积分:10金币
    快捷下载 游客一键下载
    账号登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录 QQ登录
    二维码
    微信扫一扫登录
    下载资源需要10金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP,免费下载
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    实验二 栈和队列基本操作.docx

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

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

    3、的,可设置在向量两端的任意一个端点(3)栈顶位置是随着进栈和退栈操作而变化的,用一个整型量top(通常称top为栈顶指针)来指示当前栈顶位置#include #include typedef int SElemType;typedef int Status;#define INIT_SIZE 100#define STACKINCREMENT 10#define Ok 1#define Error 0#define True 1#define False 0typedef struct SElemType *base; SElemType *top; int stacksize;SqStack

    4、;/初始化栈Status InitStack(SqStack *s) s-base = (SElemType *)malloc(INIT_SIZE * sizeof(SElemType); if(!s-base) puts(存储空间分配失败!); return Error; s-top = s-base; s-stacksize = INIT_SIZE; return Ok;/清空栈Status ClearStack(SqStack *s) s-top = s-base; return Ok; /栈是否为空Status StackEmpty(SqStack *s) if(s-top = s-b

    5、ase) return True; else return False; /销毁栈Status Destroy(SqStack *s) free(s-base); s-base = NULL; s-top = NULL; s-stacksize=0; return Ok;/获得栈顶元素Status GetTop(SqStack *s, SElemType &e) if(s-top = s-base) return Error; e = *(s-top - 1); return Ok;/压栈Status Push(SqStack *s, SElemType e) if(s-top - s-bas

    6、e = s-stacksize) s-base = (SElemType *)realloc(s-base, (s-stacksize + STACKINCREMENT) * sizeof(SElemType); if(!s-base) puts(存储空间分配失败!); return Error; s-top = s-base + s-stacksize; s-stacksize += STACKINCREMENT; *s-top+ = e; return Ok;/弹栈Status Pop(SqStack *s, SElemType *e) if(s-top = s-base) return

    7、Error; -s-top; *e = *(s-top); return Ok;/遍历栈Status StackTraverse(SqStack *s,Status(*visit)(SElemType) SElemType *b = s-base; SElemType *t = s-top; while(t b) visit(*b+); printf(n); return Ok; Status visit(SElemType c) printf(%d ,c); return Ok; int main() SqStack a; SqStack *s = &a; SElemType e; Init

    8、Stack(s); int n; puts(请输入要进栈的个数:); scanf(%d, &n); while(n-) int m; scanf(%d, &m); Push(s, m); StackTraverse(s, visit); puts(); Pop(s, &e); printf(%dn, e); printf(%dn, *s-top); Destroy(s); return 0;实验2 栈的链式表示和实现实验内容与要求:编写一个程序实现链栈的各种基本运算,并在此基础上设计一个主程序,完成如下功能:(1)初始化链栈(2)链栈置空(3)入栈(4)出栈(5)取栈顶元素(6)遍历链栈分析:

    9、链栈是没有附加头结点的运算受限的单链表。栈顶指针就是链表的头指针。注意:(1)LinkStack结构类型的定义可以方便地在函数体中修改top指针本身(2)若要记录栈中元素个数,可将元素个数属性放在LinkStack类型中定义。(3)链栈中的结点是动态分配的,所以可以不考虑上溢。#include #include #define ERROR 0#define OK 1#define TRUE 1#define FALSE 0typedef int ElemType;typedef int Status;typedef struct node ElemType data; struct node

    10、*next;StackNode;typedef struct StackNode *top;LinkStack;/初始化 void InitStack(LinkStack *s) s-top = NULL; puts(链栈初始化完成!);/将链栈置空Status SetEmpty(LinkStack *s) StackNode *p = s-top; while(p) s-top = p-next; free(p); p = s-top; puts(链栈已置空!); return OK;/压栈Status Push(LinkStack *s, ElemType e) StackNode *p;

    11、 p = (StackNode *)malloc(sizeof(StackNode); p-data = e; p-next = s-top; s-top = p; return OK;/弹栈Status Pop(LinkStack *s, ElemType &e) StackNode *p = s-top; if(s-top = NULL) puts(栈空, 不能进行弹栈操作!); return ERROR; s-top = p-next; e = p-data; free(p); return OK;/打印栈 Status PrintStack(LinkStack *s) StackNod

    12、e *p; p = s-top; while(p) printf(%d , p-data); p = p-next; puts(); return OK;int main() LinkStack s; InitStack(&s); int n; printf(请输入链栈长度:n); scanf(%d, &n); puts(请输入要录入的数据:); while(n-) int x; scanf(%d, &x); Push(&s, x); PrintStack(&s); SetEmpty(&s); return 0;实验3 队列的顺序表示和实现实验内容与要求编写一个程序实现顺序队列的各种基本运算,

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

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

    15、e OVERFLOW -1typedef struct QElemType *base; int front, rear;SqQueue;/初始化循环队列int InitQueue(SqQueue &Q) Q.base = (QElemType*)malloc(MaxQSize*sizeof(QElemType); if (Q.base = NULL) puts(分配内存空间失败!); exit(OVERFLOW); Q.front = Q.rear = 0; return 0;/将循环队列清空int ClearQueue(SqQueue &Q) Q.front = Q.rear = 0;/求

    16、队列元素的个数int QueueLength(SqQueue Q) return (Q.rear - Q.front + MaxQSize) % MaxQSize;/插入元素到循环队列int EnSqQueue(SqQueue &Q, QElemType e) if (Q.rear + 1) % MaxQSize = Q.front) return ERROR; /队列满 Q.baseQ.rear = e; /元素e入队 Q.rear = (Q.rear + 1) % MaxQSize; /修改队尾指针 return OK;/从循环队列中删除元素int DeSqQueue(SqQueue &Q

    17、, QElemType &e) if (Q.front = Q.rear) return ERROR; e = Q.baseQ.front; /取队头元素至e Q.front = (Q.front + 1) % MaxQSize; /修改队头指针,如果超内存,循环 return OK;/判断一个循环队列是否为空队列int isQueueEmpty(SqQueue Q) if (Q.front = Q.rear) return TRUE; else return FALSE;int main() int i, e; SqQueue Q; InitQueue(Q); for (i=0; iMaxQ

    18、Size-1; i+) /只有MaxQSize个数据进队列 EnSqQueue(Q, i); i = QueueLength(Q); printf(队列里的元素有%d个n, i); for (i=0; i3; i+) DeSqQueue(Q, e); printf(%d , e); printf(n); i = QueueLength(Q); printf(队列里的元素有%d个n, i); for (i=10; i12; i+) EnSqQueue(Q, i); i = QueueLength(Q); printf(队列里的元素有%d个n, i); ClearQueue(Q); i = Que

    19、ueLength(Q); printf(队列里的元素有%d个n, i); return 0;实验4 队列的链式表示和实现实验内容与要求:编写一个程序实现链队列的各种基本运算,并在此基础上设计一个主程序,完成如下功能:(1)初始化并建立链队列(2)入链队列(3)出链队列(4)遍历链队列分析:队列的链式存储结构简称为链队列。它是限制仅在表头删除和表尾插入的单链表。注意:(1)和链栈类似,无须考虑判队满的运算及上溢。(2)在出队算法中,一般只需修改队头指针。但当原队中只有一个结点时,该结点既是队头也是队尾,故删去此结点时亦需修改尾指针,且删去此结点后队列变空。(3)和单链表类似,为了简化边界条件的处

    20、理,在队头结点前可附加一个头结点。#include #include typedef int ElemType;typedef int Status;#define OK 1#define ERROR 0#define TRUE 1#define FALSE 0typedef struct Node ElemType data; struct Node *next;Node;typedef struct Node *front; Node *rear;LinkQueue;Status InitQueue(LinkQueue *q) q-front = NULL; q-rear = NULL;

    21、return OK;/InitQueueStatus DestroyQueue(LinkQueue *q) Node *p = q-front; while(p) q-front = p-next; free(p); p = q-front; puts(队列已销毁!); return OK;bool isEmpty(LinkQueue *q) if(q-front =NULL & q-rear = NULL) return TRUE; return FALSE;/isEmptyStatus Push(LinkQueue *q, ElemType e) Node *p = (Node*)mall

    22、oc(sizeof(Node); if(!p) puts(存储空间分配失败!); return ERROR; p-data = e; p-next = NULL;/防止出现野指针 if(isEmpty(q)/如果是空队列,则front指向p(第一个元素) q-front = p; else q-rear-next = p; q-rear = p;/q-rear指向队尾 return OK;/PushStatus Pop(LinkQueue *q, ElemType *e) Node *p = q-front; if(isEmpty(q) puts(队列为空!); return ERROR; *

    23、e = p-data; q-front = p-next; free(p); if(q-front = NULL)/如果出队列后队列空了,则q-rear应指向NULL, q-rear = NULL; return OK;/PopStatus createQueue(LinkQueue *q) InitQueue(q); puts(请输入要输入的队列元素个数:); int n; scanf(%d, &n); while(n-) int m; scanf(%d, &m); Push(q, m); return OK;/createQueueStatus PrintQueue(LinkQueue *

    24、q) Node *p = q-front; puts(队列中有以下元素:); while(p) printf(%d , p-data); p = p-next; puts(); return OK;int main() LinkQueue q; int e; createQueue(&q); PrintQueue(&q); Pop(&q, &e); puts(出队列的元素是:); printf(%dn, e); PrintQueue(&q); Push(&q, 8); puts(8进队列后:); PrintQueue(&q); DestroyQueue(&q); return 0;【下载本文档,可以自由复制内容或自由编辑修改内容,更多精彩文章,期待你的好评和关注,我将一如既往为您服务】


    注意事项

    本文(实验二 栈和队列基本操作.docx)为本站会员主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

    copyright@ 2008-2022 冰点文档网站版权所有

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

    收起
    展开