文档库 最新最全的文档下载
当前位置:文档库 › 循环队列入队算法EnQueue

循环队列入队算法EnQueue

循环队列入队算法EnQueue

template

void C irQueue::EnQueue(T x)

{

if ((rear+1) % QueueSize ==front) throw "上溢";

rear=(rear+1) % QueueSize; //队尾指针在循环意义下加1 data[rear]=x; //在队尾处插入元素

}

试验 --循环队列的基本操作及应用

数据结构实验报告 ----试验三循环队列的基本操作及应用 一、问题描述: 熟悉并掌握循环队列的相关操作,自己设计程序,实现循环队列的构造、清空、销毁及队列元素的插入和删除等相关操作。 二、数据结构设计: #define MAXQSIZE 10 //最大队列长度 struct SqQueue { QElemType *base; //初始化动态分配存储空间 Int front; // 头指针,若队列不空,只想对列头元素 int rear; //尾指针,若队列不空,指向队列尾元素的 //下一个位置 }; 三、功能设计: 程序中所涉及到的函数如下: Status InitQueue(SqQueue &Q) //构造一个空队列Q Status DestroyQueue(SqQueue &Q) //销毁队列Q,Q不再存在 Status ClearQueue(SqQueue &Q) //将Q清为空队列 Status QueueEmpty(SqQueue Q) //若队列Q为空队列,则 //返回TRUE,否则返回FALSE int QueueLength(SqQueue Q) //返回Q的元素个数,即队列长度Status GetHead(SqQueue Q,QElemType &e)//若队列不空,则用e返回Q的对 //头元素,并返回OK,否则返回ERROR Status EnQueue(SqQueue &Q,QElemType e)//插入元素e为Q的新的队尾元素Status DeQueue(SqQueue &Q,QElemType &e)//若队列不空,则删除Q的队头 //元素,用e返回其值,并返回 //OK,否则返回ERROR Status QueueTraverse(SqQueue Q,void(*vi)(QElemType))//从队头到队尾依次 //对队列Q中每个元素调用函数 //vi()。一旦vi失败,则操作失败四、源程序: // c1.h (程序名) #include #include #include // malloc()等 #include // INT_MAX等 #include // EOF(=^Z或F6),NULL

实验二 栈与队列操作实验题目

实验二栈与队列操作 实验目的: (1)理解栈与队列的结构特征和运算特征,以便在实际问题背景下灵活运用。 (2)了解复杂问题的递归算法设计。 本次实验中,下列实验项目选做一。 1、顺序栈的基本操作 [问题描述] 设计算法,实现顺序栈的各种基本操作 [基本要求] (1)初始化栈s。 (2)从键盘输入10个字符以$结束,建立顺序栈。 (3)从键盘输入1个元素,执行入栈操作。 (4)将栈顶元素出栈。 (5)判断栈是否为空。 (6)输出从栈顶到栈底元素。 要求程序通过一个主菜单进行控制,在主菜单界面通过选择菜单项的序号来调用各功能函数。 2、链栈的基本操作 [问题描述] 设计算法,实现链栈的各种基本操作 [基本要求] (1)初始化栈s。 (2)从键盘输入10个字符以$结束,建立带头结点的链栈。 (3)从键盘输入1个元素,执行入栈操作。 (4)完成出栈操作。 (5)判断栈是否为空。 (6)输出从栈顶到栈底元素。 (7)输出链栈的长度。 要求程序通过一个主菜单进行控制,在主菜单界面通过选择菜单项的序号来调用各功能函数。 3、循环队列的基本操作 [问题描述] 设计算法,实现循环顺序队列的建立、入队、出队等操作。 [基本要求] (1)从键盘输入10个字符以$结束,建立循环队列,并显示结果。 (2)从键盘输入1个元素,执行入队操作,并显示结果。 (3)将队头元素出队,并显示结果。 (4)要求程序通过一个主菜单进行控制,在主菜单界面通过选择菜单项的序号来调用各功能函数。

4、只用尾指针表示的循环链表队列的综合操作 [问题描述] 假设以带头结点的的循环链表表示队列,并且只设一个指针指向队尾元素的结点(注意不设头指针),试编写队列初始化、入队、出队函数。 [基本要求及提示] (1)首先定义链表结点类型。 (2)编写带头结点的循环链表的初始化函数,只用尾指针表示。 (3)编写入队函数、出队函数。 (4)在主函数中编写菜单(1.初始化;2.入队;3.出队;4.退出),调用上述功能函数。 5、用标志域表示队空队满状态的循环队列的综合操作 [问题描述] 要求循环队列不损失一个空间全部都得到利用,设置一个标志域tag,以0和1来区分当队头与队尾指针相同时队列状态的空和满,试编写与此结构相对应的入队和出队操作。 [基本要求及提示] (1)教材中为区分当队头与队尾指针相同时队列状态的空和满,以牺牲一个空间的代价来实现的,空:Q->front==Q->rear,满:(Q->rear+1)%MAXSIZE==Q->front。 (2)本题不损失一个空间全部都得到利用,为此如下定义循环队列类型: Typedef struct { QueueElementType element[MAXSIZE]; int front; int rear; int tag; }SeqQueue; 此时,循环队列空和满的条件分别为: Q->front==Q->rear&&tag==0 和 Q->front==Q->rear&&tag==1 (3)编写入队函数、出队函数。 (4)在主函数中编写菜单(1.入队;2.出队;3.退出),调用上述功能函数。 6、利用辅助数组进行栈的逆置 [问题描述] 利用辅助栈将栈中的元素逆置。 [基本要求及提示] 在主函数中编写菜单(1.入栈;2.出栈;3.逆置;4.退出)调试运行程序。 7、利用辅助栈进行队列的逆置 [问题描述] 利用辅助栈进行队列元素逆置。 [基本要求及提示] 在主函数中编写菜单(1.入队;2.出队;3.逆置;4.退出)调试运行程序。 8、Hanoi塔问题

3 实现队列的入队操作

实现队列的入队操作 函数原型: void insertNode(struct Queue* queue , ElementType value){ } 其中参数queue 是带插入元素的队列指针,后面的value 当然就是需要插入的值了。 下面写具体的逻辑: int isEmpty(struct Queue* queue){ // 判断队列是否为空,如果为空则返回 1 // 不为空则返回 0 return queue->count == 0; } void insertNode(struct Queue* queue , ElementType value){ // 创建一个新的节点 node ,并让这个节点的值等于value , next指针指向NULL struct Node* node = newNode(value , NULL); // 如果队列为空 if(isEmpty(queue)){ // 让 front 指针指向新的节点 node queue->front = node; //让 tail 指针指向新的节点 node queue->tail = node; /* * 大家可以回想以想在图示的过程中,当队列 * 为空的时候,我是没画 front 指针和 tail指针的 * 这个时候让 font 和 tail 都指向空就好了,也就是初始化 * 的时候让 font 和 tail 都指向了 NULL(空) * NULL 其实是一个宏,它的值是 0(整型 0) * 当队列中添加了第一个元素的时候我才画出来 * font 指针和 tail 指针,并且让 font 和 tail * 都指向了第一个节点,就想现在,如果队列在添加节点的时候为空 * 则执行上面的操作 * */ }else{ //如果队列不为空 /* * 大家再看一下图示过程中,当队列中有一个节点的时候,

第3章-栈与队列习题参考答案

习题三参考答案 备注: 红色字体标明的是与书本内容有改动的内容。 一、选择题 1.在栈中存取数据的原则是( B )。 A.先进先出 B. 先进后出 C. 后进后出 D. 没有限制 2.若将整数1、2、3、4依次进栈,则不可能得到的出栈序列是( D )。 A.1234 B. 1324 C. 4321 D. 1423 3.在链栈中,进行出栈操作时(B )。 A.需要判断栈是否满 B. 需要判断栈是否为空 C. 需要判断栈元素的类型 D. 无需对栈作任何差别 4.在顺序栈中,若栈顶指针top指向栈顶元素的下一个存储单元,且顺序栈的最大容量是maxSize,则顺序栈的判空条件是( A )。 A.top==0 B.top==-1 C. top==maxSize D.top==maxSize-1 5.在顺序栈中,若栈顶指针top指向栈顶元素的下一个存储单元,且顺序栈的最大容量是maxSize。则顺序栈的判满的条件是( C )。 A.top==0 B.top==-1 C. top==maxSize D.top==maxSize-1 6.在队列中存取数据元素的原则是( A )。 A.先进先出 B. 先进后出 C. 后进后出 D. 没有限制 7.在循环顺序队列中,假设以少用一个存储单元的方法来区分队列判满和判空的条件,front和rear分别为队首和队尾指针,它们分别指向队首元素和队尾元素的下一个存储单元,队列的最大存储容量为maxSize,则队列的判空条件是(A )。 A.front==rear B. front!=rear C. front==rear+1 D. front==(rear+1)% maxSize 8.在循环顺序队列中,假设以少用一个存储单元的方法来区分队列判满和判空的条件,front和rear分别为队首和队尾指针,它们分别指向队首元素和队尾元素的下一个存储单元,队列的最大存储容量为maxSize,则队列的判满条件是(D )。 A.front==rear B. front!=rear C. front==rear+1 D. front==(rear+1)% maxSize 9.在循环顺序队列中,假设以少用一个存储单元的方法来区分队列判满和判空的条件,front和rear分别为队首 和队尾指针,它们分别指向队首元素和队尾元素的下一个存储单元,队列的最大存储容量为maxSize,则队列的长度是(C )。 A.rear-front B. rear-front+1 C. (rear-front+maxSize)%maxSize D. (rear-front+1)%maxSize 10.设长度为n的链队列采用单循环链表加以表示,若只设一个头指针指向队首元素,则入队操作的时间复杂度 为( B )。 A.O(1) B.O(n) C.O(log2n) D.O(n2) 二、填空题 1.栈是一种操作受限的特殊线性表,其特殊性体现在其插入和删除操作都限制在表尾进行。允许插入和删除 操作的一端称为栈顶,而另一端称为栈底。栈具有后进先出的特点。 2.栈也有两种存储结构,一种是顺序存储,另一种是链式存储;以这两种存储结构存储的栈分别称为顺序 栈和链栈。 3.在顺序栈中,假设栈顶指针top是指向栈顶元素的下一个存储单元,则顺序栈判空的条件是 top==0 ; 栈顶

顺序队的基本操作

上机实验报告 学院:计算机与信息技术学院 专业:计算机科学与技术(师范)课程名称:数据结构 实验题目:顺序队的基本操作 班级序号:师范1班 学号: 2731 学生姓名:邓雪 指导教师:杨红颖 完成时间: 2015年12月25号

一、实验目的: 1.熟悉掌握队的定义、结构及性质;? 2. 熟练掌握循环队列的操作及应用,掌握循环队列的入队和出队等基本操作。? 3. 加深对队列结构的理解,逐步培养解决实际问题的编程能力 二、实验环境: Windows Microsoft Visual c++ 三、实验内容及要求: 掌握队列的概念及性质,并建立顺序队,实现如下功能: 1.建立一个顺序队 2.输出队 3.求队长 4.判队空 5.取队头 6.入队 7.出队 8. 清空栈 四、概要设计: 1、通过循环,由键盘输入一串数据。创建并初始化一个顺序队。 2、编写实现相关功能函数,完成子函数模块如下。 3、调用子函数,实现菜单调用功能,完成顺序表的相关操作。

#include <> #include <> #define maxsize 1024 typedef int datatype; //定义结构体 typedef struct { datatype data[maxsize]; int front,rear; }sequeue; sequeue *sq; //建立顺序队 sequeue *SET() { sequeue *sq; datatype x; sq=(sequeue *)malloc(sizeof(sequeue)); sq->front=maxsize-1; sq->rear=maxsize-1; printf("请输入要存入的结点值(以0结尾)\n"); scanf("%d",&x); while(x!=0) { sq->rear=(sq->rear+1)%maxsize; sq->data[sq->rear]=x; scanf("%d",&x); } printf("顺序队输入成功\n\n"); return sq; }

循环队列的学习解析以及C语言实现

循环队列的学习解析以及C语言实现 首先我们先来了解一下队列的概念:队列是一种先进先出的线性表只能在表头删除在表尾插入,操作系统的作业队列就是队列的一个很好的应用。也有可以在两端均可进行插入和删除操作的队列,称为双端队列,但其用处并没有一般队列广泛。 ADT Queue { 数据对象: D={ai | ai∈ElemSet, i=1,2,...,n, n≥0} 数据关系: R1={ | ai-1, ai ∈D, i=2,...,n} (约定其中a1端为队列头,an端为队列尾) 基本操作: InitQueue(&Q) 初始化队列 DestroyQueue(&Q) 销毁队列 QueueEmpty(Q) 判断队列空否 QueueLength(Q) 求取队长 GetHead(Q, &e) 取对头元素 ClearQueue(&Q) 清空对列 EnQueue(&Q, e) 入队一个元素 DeQueue(&Q, &e) 出队一个元素 QueueTravers(Q, visit())访问队列

}ADT Queue 队列也有两种存储结构,分别是顺序存储和链式存储。 队列的顺序结构和顺序表以及顺序栈的存储结构类似,他们所运用的都是一组地址连续的存储。其中队列需要附设两个整形变量front 和rear 分别指示队列头元素和队列的尾元素的位置。 (1)空队列 (2)a,b,,c 相继入队 由于顺序队列所分配的空间有限,根据队列入队和出队的特点可能发生“假溢出”现象,即队尾元素无法在前移。解决的办法就是将队列抽象成为环状,即循环队列。 循环队列 以下是循环队列的几种主要的操作以及C 语言实现: c b a 5 4 3 2 1 0 Q.rear → Q.fron → Q.rea → Q.fron → { 队空条件:Q.front=Q.rear 队满条件:(Q.rear+1)%MAXQSIZE

循环队列的入队和出队

循环队列的入队和出队 程序如下: #include #include #include #include #define Max 20 typedef struct { int data[Max+1]; int front,rear; }SeqQueue; void SetNull(SeqQueue *q) { q->front=q->rear=0; } int Empty(SeqQueue *q) { if(q->rear ==q->front ) return 1; else return 0; } int GetFront(SeqQueue *q) { if(Empty(q)) { printf("队空"); exit(1); } else return(q->data[(q->front +1)%Max]); } int EnQueue(SeqQueue *q,int x) { if(q->front==(q->rear+1)%Max) { printf("溢出!\n"); exit(1); } else { q->rear=(q->rear+1)%Max;

q->data[q->rear]=x; return 1; } } int DeQueue(SeqQueue *q) { if(Empty(q)) { printf("队列为空!\n"); exit(1); } else { q->front =(q->front +1)%Max; return(q->data [q->front ]); } } void main() { int x; int n,i; SeqQueue *q; q=(SeqQueue*)malloc(sizeof(SeqQueue)); SetNull(q); printf("请输入入队元素的个数:"); scanf("%d",&n); printf("请输入入队元素:"); for(i=0;i

数据结构第3章 栈与队列习题

第3章栈与队列 一、单项选择题 1.元素A、B、C、D依次进顺序栈后,栈顶元素是,栈底元素是。 A.A B.B C.C D.D 2.经过以下栈运算后,x的值是。 InitStack(s);Push(s,a);Push(s,b);Pop(s,x);GetTop(s,x); A.a B.b C.1 D.0 3.已知一个栈的进栈序列是ABC,出栈序列为CBA,经过的栈操作是。 A.push,pop,push,pop,push,pop B.push,push,push,pop,pop,pop C.push,push,pop,pop,push,pop D.push,pop,push,push,pop,pop 4.设一个栈的输入序列为A、B、C、D,则借助一个栈所得到的序列是。 A.A,B,C,D B.D,C,B,A C.A,C,D,B D.D,A,B,C 5.一个栈的进栈序列是a,b,c,d,e,则栈的不可能的输出序列是。 A.edcba B.decba C.dceab D.abcde 6.已知一个栈的进栈序列是1,2,3,……,n,其输出序列的第一个元素是i,则第j个出栈元素是。 A.i B.n-i C.j-i+1 D.不确定 7.已知一个栈的进栈序列是1,2,3,……,n,其输出序列是p1,p2,…,Pn,若p1=n,则pi的值。 A.i B.n-i C.n-i+1 D.不确定 8.设n个元素进栈序列是1,2,3,……,n,其输出序列是p1,p2,…,p n,若p1=3,则p2的值。 A.一定是2 B.一定是1

C.不可能是1 D.以上都不对 9.设n个元素进栈序列是p1,p2,…,p n,其输出序列是1,2,3,……,n,若p3=1,则p1的值。 A.可能是2 B.一定是1 C.不可能是2 D.不可能是3 10.设n个元素进栈序列是p1,p2,…,p n,其输出序列是1,2,3,……,n,若p3=3,则p1的值。 A.可能是2 B.一定是2 C.不可能是1 D.一定是1 11.设n个元素进栈序列是p1,p2,…,p n,其输出序列是1,2,3,……,n,若p n=1,则p i(1≤i≤n-1)的值。 A.n-i+1 B.n-i C.i D.有多种可能 12.判定一个顺序栈S为空的条件为。 A.S.top= =S.base B.S.top!= S.base C.S.top!= S.base+S.stacksize D.S.top= = S.base+S.stacksize 13.判定一个顺序栈S为栈满的条件是。 A.S.top-S.base= =S.stacksize B.S.top= = S.base C.S.top-S.base!=S.stacksize D.S.top!= S.base 14.链栈与顺序栈相比有一个明显的优点,即。 A.插入操作方便B.通常不会出现栈满的情况 C.不会出现栈空的情况D.删除操作更加方便 15.最不适合用作链栈的链表是。 A.只有表头指针没有表尾指针的循环双链表 B.只有表尾指针没有表头指针的循环双链表 C.只有表尾指针没有表头指针的循环单链表 D.只有表头指针没有表尾指针的循环单链表 16.如果以链表作为栈的存储结构,则退链栈操作时。 A.必须判别链栈是否满B.判别链栈元素的类型 C.必须判别链栈是否空D.对链栈不作任何判别

循环队列算法

前天写了栈的实现,今天到队列了,好像明天要期中考试,还是三科,次奥,考吧考吧,五一三天已经贡献给你们了,考成什么样我也认了,毕竟智商在这里。说好的一天来一发,不要说我水,其实我还真的是水,上个学期数据结构课打酱油,这个学期又自己抱本书从第一页开始恭恭敬敬地学,不敢跳过一个字。估计是脑子里面灌浆了。上学期不认真。前车之鉴,希望筒子们好好的把数据结构学好。希望老夫子还为时不晚。 队列和栈一样也是一种很基本的数据结构,队列的用途很多,下面是两个例子。 第一个例子就是CPU资源的竞争问题。在具有多个终端的计算机系统中,有多个用户需要使用CPU各自运行自己的程序,它们分别通过各自终端向操作系统提出使用CPU的请求,操作系统按照每个请求在时间上的先后顺序,将其排成一个队列,每次把CPU分配给队头用户使用,当相应的程序运行结束,则令其出队,再把CPU分配给新的队头用户,直到所有用户任务处理完毕。 第二个例子就是主机与外部设备之间速度不匹配的问题。以主机和打印机为例来说明,主机输出数据给打印机打印,主机输出数据的速度比打印机打印的速度要快得多,若直接把输出的数据送给打印机打印,由于速度不匹配,显然是不行的。所以解决的方法是设置一个打印数据缓冲区,主机把要打印输出的数据依此写如到这个缓冲区中,写满后就暂停输出,继而去做其它的事情,打印机就从缓冲区中按照先进先出的原则依次取出数据并打印,打印完后再向主机发出请求,主机接到请求后再向缓冲区写入打印数据,这样利用队列既保证了打印数据的正确,又使主机提高了效率。 通过上面的两个例子我们知道队列和栈之间的本质的区别了。栈是遵循先进后出,而队列则是遵循先进先出。由于它的先进先出,导致当队头的元素出来之后,队头的指针会上移,往队尾插入元素的时候队尾的指针也是往上移,这个和我们平时的生活经验可能不一样,以我们平时的生活经验,排队买票,队头的人买完票之后,后面的人会向前补上来,这一补可是所有的人都要往前移动一个位置,这在计算机的队列中就相当于要后面的所有元素都要往前进一个位置,这个开销是很大的,所以,计算机中的队列没有采取这样的方法。但是这样之后另外一个问题又出来了,当把队头的元素移走之后,队头上移,我们知道,队列插入元素是从后面插入的,这就造成了队头前面的内存空出来了,而且还不能用了,因为我们不能把元素从队头插进去。于是乎,聪明的人们想到了循环队列这种东西。当队尾插不进去,队头前面又还有空位的时候,就把队尾下调到队头前面的位置,但记住他还是队尾,如此下去,就不会担心内存的浪费了。下面用图来解释一下:

《数据结构》习题集:第3章 栈和队列

第3章栈和队列 一、选择题 1.栈结构通常采用的两种存储结构是(A )。 A、顺序存储结构和链表存储结构 B、散列和索引方式 C、链表存储结构和数组 D、线性链表结构和非线性存储结构 2.设栈ST 用顺序存储结构表示,则栈ST 为空的条件是( B ) A、ST.top-ST.base<>0 B、ST.top-ST.base==0 C、ST.top-ST.base<>n D、ST.top-ST.base==n 3.向一个栈顶指针为HS 的链栈中插入一个s 结点时,则执行( C ) A、HS->next=s; B、s->next=HS->next;HS->next=s; C、s->next=HS;HS=s; D、s->next=HS;HS=HS->next; 4.从一个栈顶指针为HS 的链栈中删除一个结点,用x 保存被删除结点的值,则执行( C) A 、x=HS;HS=HS->next; B 、HS=HS->next;x=HS->data; C 、x=HS->data;HS=HS->next; D 、s->next=Hs;Hs=HS->next; 5.表达式a*(b+c)-d 的后缀表达式为( B ) A、abcdd+- B、abc+*d- C、abc*+d- D、-+*abcd 6.中缀表达式A-(B+C/D)*E 的后缀形式是( D ) A、AB-C+D/E* B、ABC+D/E* C、ABCD/E*+- D、ABCD/+E*- 7.一个队列的入列序列是1,2,3,4,则队列的输出序列是( B ) A、4,3,2,1 B、1,2,3,4 C、1,4,3,2 D、3,2,4,1 8.循环队列SQ 采用数组空间SQ.base[0,n-1]存放其元素值,已知其头尾指针分别是front 和rear,则判定此循环队 列为空的条件是() A、Q.rear-Q.front==n B、Q.rear-Q.front-1==n C、Q.front==Q.rear D、Q.front==Q.rear+1 9.循环队列SQ 采用数组空间SQ.base[0,n-1]存放其元素值,已知其头尾指针分别是front 和rear,则判定此循环队 列为满的条件是() A、Q.front==Q.rear B、Q.front!=Q.rear C、Q.front==(Q.rear+1)%n D、Q.front!=(Q.rear+1)%n 10.若在一个大小为6 的数组上实现循环队列,且当前rear 和front 的值分别为0 和3,当从队列中删除一个元素, 再加入两个元素后,rear 和front 的值分别为() A、1,5 B、2, 4 C、4,2 D、5,1 11.用单链表表示的链式队列的队头在链表的()位置 A、链头 B、链尾 C、链中 12.判定一个链队列Q(最多元素为n 个)为空的条件是() A、Q.front==Q.rear B、Q.front!=Q.rear C、Q.front==(Q.rear+1)%n D、Q.front!=(Q.rear+1)%n 13.在链队列Q 中,插入s 所指结点需顺序执行的指令是() A 、Q.front->next=s;f=s; B 、Q.rear->next=s;Q.rear=s; C 、s->next=Q.rear;Q.rear=s; D 、s->next=Q.front;Q.front=s; 14.在一个链队列Q 中,删除一个结点需要执行的指令是() A、Q.rear=Q.front->next; B、Q.rear->next=Q.rear->next->next; C、Q.front->next=Q.front->next->next; D、Q.front=Q.rear->next;

链队列和循环队列数据结构实验

淮海工学院计算机科学系实验报告书 课程名:《数据结构》 题目:数据结构实验 链队列和循环队列 班级: 学号: 姓名:

线性数据结构算法实现与应用报告要求 1目的与要求: 1)掌握栈与队列的数据类型描述及特点; 2)掌握栈的顺序和链式存储存表示与基本算法的实现; 3)掌握队列的链式存储表示与基本操作算法实现; 4) 掌握栈与队列在实际问题中的应用和基本编程技巧; 5)按照实验题目要求,独立完成实际程序的编写编写、调试和运行,并通过用例数据的运行过程抓获相关屏面验证程序设计的正确性; 7)认真书写实验报告,并按时提交。 2 实验内容或题目 以下题目学生根据自己的兴趣和能力可选作一道作为实验题目: 1)根据栈数据结构,分别建立一个顺序栈和链式栈并实现其上基本操作(出栈和入栈等); 2)根据队列数据结构,分别建立链队列和循环队列,并完成其上的基本操作(出入队列等); 3)参考书上表达式求值例题,应用栈的基本操作实现带括号表达式求值运算及其进出栈模拟过程(给出程序执行过程中栈的变化过程); 4)阅读P83栈与递归的实现一节内容和3阶汉诺塔问题。使用栈数据结构解决3阶汉诺塔问题,编写程序并模拟栈及其汉诺塔的搬运过程(给出程序执行过程栈的变化过程与圆盘的搬动状态)。 5)其它实际应用举例(如打印杨辉三角形)。 3 实验步骤与源程序 链队列 #include #include #include #define OK 1 #define ERROR 0 #define OVERFLOW 0 typedef struct QNode { int data; struct QNode *next; }QNode,*QueuePtr; typedef struct { QueuePtr front; QueuePtr rear; }LinkQueue; int InitQueue(LinkQueue &Q)

循环队列,出队,入队

数据结构循环队列的顺序结构实现以及队列的初始化、入队、出队等基本操作函数 2009-11-15 15:09

#include #include #define max 50 //队列的数据结构 typedef struct { int element[max];//队列的元素空间 int front;//头指针指示器 int rear;//尾指针指示器 }SeqQueue; //函数声明表 void Print(SeqQueue *Q); void Choose(int choice,SeqQueue *Q); void InitQueue(SeqQueue *Q); int EnterQueue(SeqQueue *Q,int x); int DeleteQueue(SeqQueue *Q,int *x);

void PrintQueue(SeqQueue *Q); //主函数 int main() { SeqQueue Q; InitQueue(&Q); system("color a");//系统变色为浅绿 Print(&Q); while(true) { printf("Press enter to continue........."); getchar(); getchar(); system("cls"); Print(&Q); } return 0; } //重复刷新并打印功能选项列表来模拟面向对象编程的等待命令操作 void Print(SeqQueue *Q) { int choice; printf("Made By 杨梅树的盔甲~O(∩_∩)O~\n"); printf("---------------------\n"); printf("使用说明:本程序可实现顺序结构构建队列及队列的初始化、入队、出队等基本操作.\n"); printf("---------------------\n"); printf("1.入队.\n"); printf("2.出队.\n"); printf("3.打印输出当前队列.\n"); printf("4.按其它任意键退出.\n"); printf("---------------------\n"); printf("请选择你要的操作:"); scanf("%d",&choice); Choose(choice,Q); } //选择功能函数 void Choose(int choice,SeqQueue *Q)

循环队列的操作和实现C语言

循环队列的基本操作都可以实现,后面有代码。

代码: #include #include #include #include #define MAX_SIZE 10//定义循环队列的长度typedef struct{ int*base; int front; int rear; int full;//队列是否已满的标志位}Queue; int creat_queue(Queue*q); int en_queue(Queue*q,int e); int out_queue(Queue*q,int*e); int destroy_queue(Queue*q); int length_queue(Queue*q);

void main() { Queue q; int m,n,i,e,f,f1,k=0; int a1,a2,a3,a4,a5,a6;//用来接函数返回值 int *e1,*e2; q.base=NULL; e1=e2=&k;//对于指针最好这样初始化定义一下,因为只声明是没有分陪内存的,不能直接用*e printf("----------------循环队列的基本操作---------------\n"); printf("----------------1.创建一个空队列-----------------\n"); printf("----------------2.单次入队列---------------------\n"); printf("----------------3.单次出队列---------------------\n"); printf("----------------4.集体入队列---------------------\n"); printf("----------------5.集体出队列---------------------\n"); printf("----------------6.队列元素个数-------------------\n"); printf("----------------7.销毁队列-----------------------\n"); printf("----------------0.退出---------------------------\n"); loop: printf("请选择:"); scanf("%d",&m); switch(m) { case 1: a1=creat_queue(&q); if(a1==0) { printf("队列已经存在,请先销毁原来队列!\n"); break;} printf("OK!队列创建成功!\n"); break; case 2: printf("请输入要入队列的元素(整型):"); scanf("%d",&e); a2=en_queue(&q,e); if(a2==-1) { printf("队列不存在,请先创建队列!\n"); break; } else if(a2==0) { printf("入队失败!因为队列满了!\n"); break; } else { printf("OK!入队成功!\n"); break; } case 3: a3=out_queue(&q,e1);

实验八-队列(循环队列)的表示和实现-舞伴问题

浙江大学城市学院实验报告 课程名称数据结构基础 实验项目名称实验八队列(循环队列)的表示和实现 学生姓名*** 专业班级信管1104 学号3110**** 实验成绩指导老师(签名)日期 一.实验目的和要求 1、掌握队列的存储结构及基本操作。 2、掌握循环队列的设置及循环队列的各种基本操作的实现。 3、通过具体的应用实例,进一步熟悉和掌握队列的实际应用。 二.实验内容 1、建立头文件SeqQueue.h,定义顺序存储的循环队列存储结构,并编写循环队列的各种基本操作实现函数。同时建立一个验证操作实现的主函数文件test3_2.cpp,编译并调试程序,直到正确运行。 2、选做:编写程序,实现舞伴问题。假设在周末舞会上,男士们和女士们进入舞厅时,各自排成一队,跳舞开始时,依次从男队和女队的队头上各出一人配成舞伴,若两队初始人数不相同,则较长的那一队中未配对者等待下一轮舞曲。要求设计一个函数void partner(),模拟上述舞伴配对问题。 基本要求: 1) 由键盘输入数据,每对数据包括姓名和性别; 2) 输出结果包括配成舞伴的女士和男士的姓名,以及未配对者的队伍名称和队头者的姓名; 3) 要求利用SeqQueue.h中已实现的顺序循环队列的基本操作函数来实现。函数void partner() 添加到文件test3_2.cpp中,在主函数中进行调用测试。 3、填写实验报告,实验报告文件取名为report8.doc。 4、上传实验报告文件report8.doc、源程序文件test3_2.cpp及SeqQueue.h 到Ftp服务器上自己的文件夹下。 三. 函数的功能说明及算法思路 (包括每个函数的功能说明,及一些重要函数的算法实现思路) 1)InitQueue(Queue &q) 实现初始化队列的功能 2)EnQueue(Queue &q,ElemType item) 向队列插入元素item

PTA第三章栈和队列练习题

1-1 通过对堆栈S操作:Push(S,1), Push(S,2), Pop(S), Push(S,3), Pop(S), Pop(S)。输出的序列为:123。(2分) T F 作者: DS课程组 单位: 浙江大学 1-2 在用数组表示的循环队列中,front值一定小于等于rear值。(1分) T F 作者: DS课程组 单位: 浙江大学 1-3 若一个栈的输入序列为{1, 2, 3, 4, 5},则不可能得到{3, 4, 1, 2, 5}这样的出栈序列。(2分) T F 作者: 徐镜春 单位: 浙江大学 1-4 If keys are pushed onto a stack in the order {1, 2, 3, 4, 5}, then it is impossible to obtain the output sequence {3, 4, 1, 2, 5}. (2分) T F 作者: 徐镜春 单位: 浙江大学 1-5 所谓“循环队列”是指用单向循环链表或者循环数组表示的队列。(1分) T F 作者: DS课程组 单位: 浙江大学 1-6 An algorithm to check for balancing symbols in an expression uses a stack to store the symbols. (1分) T F 2-1 设栈S和队列Q的初始状态均为空,元素a、b、c、d、e、f、g依次进入栈S。若每个元素出栈后立即进入队列Q,且7个元素出队的顺序是b、d、c、f、e、a、g,则栈S的容量至少是:(2分)

1. 1 2. 2 3. 3 4. 4 作者: DS课程组 单位: 浙江大学 2-2 若元素a、b、c、d、e、f依次进栈,允许进栈、退栈操作交替进行,但不允许连续三次进行退栈工作,则不可能得到的出栈序列是?(2分) 1. b c a e f d 2. c b d a e f 3. d c e b f a 4. a f e d c b 作者: DS课程组 单位: 浙江大学 2-3 设一个栈的输入序列是1、2、3、4、5,则下列序列中,是栈的合法输出序列的是?(2分) 1. 3 2 1 5 4 2. 5 1 2 3 4 3. 4 5 1 3 2 4. 4 3 1 2 5

第三章+栈和队列(参考答案)

第三章栈和队列 一、判断题 1、链栈的初始化是指开辟足够多的结点,然后置栈顶指针为 NULL。(×) 2、递归定义的数据结构通常不需要用递归的算法来实现对它的操作。(×) 二、填空题 1、向一个链式栈插入一个新结点时,首先把栈顶指针的值赋给新结点的指针域,然后把新结点的存储位置赋给___栈顶指针_____。 2、迷宫问题是一个回溯控制的问题,最好使用____栈______的方法来解决。 3、有如下递归过程: Void Print(int w) { int i; if (w!=0) { Print(w?1); for (i=1;i<=w;i++) printf(“%3d”,w); printf(“\n”); } } 调用语句print(4)的结果是__________。 1 2 2 3 3 3 4 4 4 4 4、假设用循环单链表实现队列,若队列非空,且队尾指针为R, 则将新结点S加入队列时,需执行下面语句:_ S->next=R->next _________;___ R->next=S _______;R=S; 三、选择题 1、设有4个数据元素a1、a 2、a3和a4,对他们分别进行栈操作或队操作。在进栈或进队操作时,按a1、a2、a 3、a4次序每次进入一个元素。假设栈或队的初始状态都是空。 现要进行的栈操作是进栈两次,出栈一次,再进栈两次,出栈一次;这时,第一次出栈得到的元素是 A 2,第二次出栈得到的元素是 B 4;类似地,考虑对这四个数据元素进行的队操作是进队两次,出队一次,再进队两次,出队一次;这时,第一次出队得到的元素是 C 1,第二次出队得到的元素是 D 2。经操作后,最后在栈中或队中的元素还有 E 2个。 供选择的答案: A~D:①a1 ②a2 ③ a3 ④a4 E:①1 ②2 ③ 3 ④ 0 2、栈是一种线性表,它的特点是 A 2。设用一维数组A[1,…,n]来表示一个栈,A[n]为栈底,用整型变量T指示当前栈顶位置,A[T]为栈顶元素。往栈中推入(PUSH)一个新元素时,变量T的值 B 2;从栈中弹出(POP)一个元素时,变量T的值 C 1。设栈空时,有输入序列a,b,c,经过PUSH,POP,PUSH,PUSH,POP操作后,从栈中弹出的元素的序列是 D 6,变量T的值是 E 4。 供选择的答案: A:①先进先出②后进先出③进优于出④出优于进⑤随机进出 B,C:①加1 ②减1 ③不变④清⑤加2 ⑥减2 D:① a,b ②b,c ③c,a ④b,a ⑤ c,b ⑥a,c E:① n+1 ②n+2 ③ n ④ n-1 ⑤ n-2 3、在做进栈运算时,应先判别栈是否 A 2;在做退栈运算时,应先判别栈是否 B 1。当栈中元素为n个,做进栈运算时发生上溢,则说明该栈的最大容量为 C 2。

循环队列实现数据的入队与出对程序算法

#include #include #define maxlen 11 typedef struct{ int data[maxlen]; int front; int rear; }seqqueue; seqqueue *seq() { seqqueue *Q; Q=(seqqueue *)malloc(sizeof(seqqueue)); Q->front=0; Q->rear=0; return Q; } int full(seqqueue *Q){ if(Q->front==(Q->rear+1)%maxlen) return 1; else return 0; } int empty(seqqueue *Q){ if (Q->front==Q->rear) return 1; else return 0; } void add(seqqueue *Q,int x) { if(!full(Q)) { Q->rear=(Q->rear+1)%maxlen; Q->data[Q->rear]=x; } else printf("queue full!"); } void del(seqqueue *Q) { if(!empty(Q)) Q->front=(Q->front+1)%maxlen; else printf("queue empty");

} int length(seqqueue *Q) { int a; a=(Q->rear-Q->front+maxlen)%maxlen; return a; } void out(seqqueue *Q) { int i,j,y; j=length(Q); for(i=1;ifront+i)%maxlen; printf("%3d",Q->data[y]); } } void main() { seqqueue Q; int i,x,n; Q=*seq(); printf("该循环最多存放10个数。\n"); printf("请输入你要输入元素的个数:"); scanf("%d",&n); printf("请输入%d个元素:",n); for(i=0;i

相关文档
相关文档 最新文档