1、实验4栈与队列实验 续实验4:栈与队列实验 续学生姓名: 张皓然 学 号: 5501215001 专业班级: 本硕151 一、实验目的:(1)掌握链接存储队列的进队和出队等基本操作。(2)掌握环行队列的进队和出队等基本操作。(3)加深对队列结构的理解,逐步培养解决实际问题的编程能力。二、链队列实验要求:(1)编写链接队列的基本操作函数。typedef struct QNode int data; struct QNode *next;QNode,*QueuePtr;typedef struct QueuePtr front; /队头指针 QueuePtr rear; /队尾指针LinkQueu
2、e;进队操作 EnQueue(LinkQueue &Q, int e)出队操作,队空DeQueue(LinkQueue &Q, int &e)输出队列中元素 0utputQueue(LinkQueue Q)(2)调用上述函数实现下列操作,操作步骤如下。调用进队函数建立一个队列。读取队列中的第一个元素。从队列中删除元素。输出队列中的所有元素。注意 每完成一个步骤就必须及时输出队列中元素,以便观察操作结果。三、链队列实现代码及注释:/链接队列的实现#include #includeusing namespace std;#define ERROR 1#define OK 0#define OVER
3、FLOW -1#define MAXQSIZE 100 /最大队列长度typedef struct QNode/结点 int data;/数据域 QNode *next;/指针域 QNode,*QueuePtr;typedef struct QueuePtr front;/队头指针 QueuePtr rear; /队尾指针LinkQueue;int initqueue(LinkQueue &q) /构造一个空队列并进行初始化 int m; QNode *p; q.front=q.rear=(QNode*)malloc(sizeof(QNode);/申请头结点 if(!q.front) exit
4、(OVERFLOW); /存储空间分配失败 q.front-next=NULL;/空队列 cout初始化队列:(0代表结束)data=m;/m为数据值 q.rear-next=p;/队尾的指针域指向p p-next=NULL;/p的指针域为空 q.rear=p;/队尾指针后移 return OK;int gethead(LinkQueue q) /用e返回队头的值 int e; if(q.front=q.rear) coutnext-data;/第一个节点为头结点,所以需要next cout队头的值为:eendl; return OK;int enqueue(LinkQueue &q) /插入
5、元素e为新的队尾元素 int e; QNode *p; p=(QNode*)malloc(sizeof(QNode); if(!p) exit(OVERFLOW); coute; p-data=e;/p的数据域为e p-next=NULL;/p的next为空 q.rear-next=p;/队尾的指针域指向新的结点 q.rear=p;/ 队尾指针后移 return OK;int dequeue(LinkQueue &q) /删除队头元素,并用e返回所删除的值 int e; if(q.front=q.rear) coutnext;/p指向第一个元素 e=p-data;/e取得第一个元素的值 q.f
6、ront-next=p-next;/头结点指向第二个元素 if(q.rear=p) q.rear=q.front; /这种情况是只有一个元素的情况,被删除后队尾指针指向的地方没有意义,需要等于队头指针 free(p);/释放p的空间 cout删除成功!被删除队头的值为:eendl; return OK;int showqueue(LinkQueue &q) /遍历队列元素 QNode *p; if(q.front=q.rear) coutnext; cout队列里的值为:; while(p!=NULL) coutdatanext; coutendl; return OK;void menu()
7、/菜单 cout*n; cout* 链队列基本操作 *n; cout*n; cout* 1.输出队头的值 *n; cout* 2.向队尾插入新元素 *n; cout* 3.删除队头 *n; cout* 4.遍历队列 *n; cout* 5.初始化队列 *n; cout* 0.退出 *n; cout*n;cout请输入要选择的选项(0-5):n;int main() int k=1; LinkQueue q; menu(); while(k) /循环操作 coutk; switch(k) case 0:break; case 1:gethead(q);showqueue(q);break; ca
8、se 2:enqueue(q);showqueue(q);break; case 3:dequeue(q);showqueue(q);break; case 4:showqueue(q);break; case 5:initqueue(q);showqueue(q); break; default: couterror!n;break;/默认选项 return 0; 四、链队列测试结果:建立一个队列的功能1.输入的形式和输入值的范围:输入若干正整数,用空格分隔,用0来表示结束。2.输出的形式:按输入顺序输出。3.测试数据:输入5 2 3 6 9 0后,输出5 2 3 6 9(2)取队头元素功能
9、1.取出队头元素是:52.输出队列元素是:5 2 3 6 9(3)删除队头元素功能1.删除队列数据元素是:52.输出队列元素是:2 3 6 9(4)输出队列所有元素功能输出队列所有元素是:2 3 6 9(5)结束功能输入0结束程序!五、循环队列实验要求:编写环型队列的基本操作函数。#define MAXSIZE 100 /最大队列长度,最多只能插入MAXSIZE-1个数据typedef struct int *base; /初始化的动态分配存储空间 int front; /头指针,若队列不为空,指向队列头元素 int rear; /为指针,若队列不为空,指向队列尾元素的下一个位置SqQueue
10、;进队操作,返回1为队满 EnQueue(SqQueue &Q, int e)出队操作,返回1为队空 DeQueue(SqQueue &Q, int &e)输出队列中元素 OutputQueue(SqQueue &Q)(4)调用上述函数实现下列操作,操作步骤如下:调用进队函数建立一个队列。读取队列中的第一个元素。从队列中删除元素。输出队列中的所有元素。注意 每完成一个步骤就必须及时输出队列中元素,以便观察操作结果。六、循环队列实现代码及注释#include #includeusing namespace std;/符号定义 #define ERROR 1#define OK 0#define
11、OVERFLOW -1#define MAXQSIZE 100 /最大队列长度typedef struct int *base; /初始化的动态分配存储空间基地址 int front; /头指针,若队列不空,指向队列头元素 int rear; /尾指针,若队列不空,指向队列尾元素的下一个位置 sqqueue;int initsqqueue(sqqueue &q) /构造一个空队列并进行初始化 int m; q.base=(int*)malloc(MAXQSIZE*sizeof(int); if(!q.base) exit(OVERFLOW); /存储空间分配失败 q.front=q.rear=
12、0; while(scanf(%d,&m)!=EOF&m!=0) q.baseq.rear=m; q.rear+; return OK;int getsqhead(sqqueue q) int e; if(q.rear=q.front) cout队列为空!n; return ERROR; /队列空 e=q.baseq.front; cout队头的值为eendl; return OK;int ensqqueue(sqqueue &q) /插入元素e为新的队尾元素 if(q.rear+1)%MAXQSIZE=q.front) cout队列满!n; return ERROR; /队列满 int e;
13、 coute; q.baseq.rear=e;/插入e q.rear=(q.rear+1)%MAXQSIZE;/新的队尾 return OK;int desqqueue(sqqueue &q) /删除队头元素 if(q.rear=q.front) cout删除失败n; return -1; /队列空 int e; e=q.baseq.front; cout删除成功!所删除的队头的值为:eendl; q.front=(q.front+1)%MAXQSIZE;/指针后移 return OK;int showsqqueue(sqqueue q) /遍历队列元素 int n; n=q.front; i
14、f(q.front=q.rear) cout队列为空!n; return -1; cout队列里的值为:; while(n!=q.rear) coutq.basen ; n=(n+1)%MAXQSIZE; coutendl; return OK;void menu()/菜单 cout*n; cout* 循环队列测试 *n; cout*n; cout* 1.输出队头的值 *n; cout* 2.向队尾插入新元素 *n; cout* 3.删除队头 *n; cout* 4.遍历队列 *n; cout* 5.初始化队列 *n; cout* 0.退出 *n; cout*n; cout请输入要选择的选项(
15、0-5):n; int main() int k=1; sqqueue q; menu(); while(k) /循环操作 coutk; switch(k) case 0:break; case 1:getsqhead(q);showsqqueue(q);break; case 2:ensqqueue(q);showsqqueue(q);break; case 3:desqqueue(q);showsqqueue(q);break; case 4:showsqqueue(q);break; case 5:initsqqueue(q);showsqqueue(q); break; default
16、: couterror!n;break;/默认选项 return 0;七、循环队列实验调试结果:/环型队列(1)初始化队列(2)建立一个队列的功能1.输入的形式和输入值的范围:输入若干正整数,用空格分隔,用0来表示结束。2.输出的形式:按输入顺序输出。3.测试数据:输入11 12 13 14 15 0后,输出11 12 13 14 15(3)取队头元素功能1.取出队头元素是:112.输出队列元素是:11 12 13 14 15(4)删除队头元素功能1.删除队列数据元素是:112.输出队列元素是:12 13 14 15(5)输出队列所有元素功能输出队列所有元素是:12 13 14 15(6)进队功能1.输入进队的元素:162.输出所有的(7)结束功能输入0结束程序!8、实验体会在初始化队列中,要求的是用0代表输入的结束,可以用while循环来判断输入是否终止。 while(scanf(%d,&m)!=EOF&m!=0) q.baseq.rear=m; q.rear+; 当m等于0时,判断条件为false,不再读入数据。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1