数据结构——队列的应用

数据结构——队列的应用
数据结构——队列的应用

软件学院

上机实验报告

课程名称:数据结构

实验项目:队列的应用

实验室:耘慧420 姓名:学号

专业班级:实验时间: 2016.11.17

一、实验目的及要求

(一) 目的

1.掌握栈队列特点及顺序存储结构(循环队列)下基本操作的实现。

2.掌握队列的应用,能根据问题特点选择队列结构。

(二).要求

1.定义循环队列的存储结构

2.完成入队、出队、取队头等基本操作的实现。

3.利用队列的基本操作实现n行杨辉三角的输出。

4.主函数调用杨辉三角输出函数,实现n行杨辉三角输出。

二、性质

设计性

三、实验学时

2学时

四、实验环境

C与C++程序设计学习与实验系统

五、实验内容及步骤

(一).内容

1.定义循环队列的存储结构,完成入队、出队、取队头等基本操作的实现。

2. 利用循环队列实现杨辉三角的输出

(二).步骤

1.//---------循环队列—队列的顺序存储结构 -----

#define MAXSIZE 100

typedef struct {

QElemType *base; //初始化的动态分配存储空间

int front; //头指针,队列不空指向队列头元素

int rear; //尾指针,队列不空指向队列尾元素下一位置

} SqQueue;

2.杨辉三角:

1

1 1

1 2 1

1 3 3 1

1 4 6 4 1

……………………

这是一个初等数学中讨论的问题。系数表中的第 k行有 k个数,除了第一个和最后一个数为1之外,其余的数则为上一行中位其左、右的两数之和。

如果要求计算并输出杨辉三角前n行的值,则队列的最大空间应为 n+2。假设队列中已存有第 k 行的计算结果,并为了计算方便,在两行之间添加一个"0"作为行界值,则在计算第 k+1 行之前,头指针正指向第 k 行的"0",而尾元素为第 k+1 行的"0"。由此从左到右依次输出第 k 行的值,并将计算所得的第 k+1 行的值插入队列的基本操作为:

void YangHui(int n)

{

printf("1\n");

EnQueue(&q,0); /*开始*/

EnQueue(&q,1); /*第1行*/

EnQueue(&q,1);

for(j=2;j<=n;j++)

{

EnQueue(&q,0);

do{

DeQueue(&q,&s);

GetHead(&q,&t);

if(t) printf("%d\t",t); /*非0输出,否则换行*/ else printf("\n");

EnQueue(&q,s+t);

}while(t!=0); /*遇到结束符前循环*/

}

DeQueue(&q,&s);

}

六、实验数据及结果分析

1.详细记录在调试过程中出现的问题及解决方法;

杨辉三角;

首先输入程序需要打印出来杨辉三角的行数N。(截图的N值为12),N值要求小于等于20。之后运行程序,即得到如下结果队列进队

七、总结

通过对本程序的练习,更好地掌握了队列的概念和相关操作,对杨辉三角的算法、队列的进队出队有了更深刻的认识。在实验中,增强了C语言开发的语法知识,体会到自己C语言知识的不足,造成了自己调试程序没有那么顺利。以后要增加C语言和C++语言的区别。使得自己更快,更准的进行程序的调试。

附录源程序清单插入;

队列进队;

#include "stdio.h"

#include "malloc.h"

#define OK 1

#define OVERFLOW -1

#define ERROR 0

#define QMAXSIZE 23//定义长度,长度>=输出行数+3

typedef int ElemType;

typedef int Status;

typedef struct

{

ElemType data[ QMAXSIZE ];//定义数据域

ElemType *base; //初始化的动态分配存储空间

int front; //头指针,队列不空指向队列头元素

int rear; //尾指针,队列不空指向队列尾元素下一位置

}SqQueue;

Status InitQueue(SqQueue *Q)

{//构造空队列

Q->base=(ElemType *)malloc(QMAXSIZE * sizeof(ElemType));//分配空间if(!Q->base)

return ERROR;

Q->front=Q->rear=0;

return OK;

}

Status QueueLength(SqQueue Q)

{//获取队列长度

return (Q.rear-Q.front+QMAXSIZE)%QMAXSIZE;

}

Status GetHead(SqQueue Q)

{//返回队头元素

ElemType e;

if(Q.front == Q.rear)

e=0;

else

e=Q.data[Q.front];

return e;

}

Status EnQueue(SqQueue *Q,ElemType e)

{//插入元素

if((Q->rear+1)% QMAXSIZE == Q->front)

return ERROR;

Q->data[Q->rear]=e;

Q->rear=(Q->rear+1)%QMAXSIZE;

return OK;

}

Status DeQueue(SqQueue *Q,ElemType *e) {//删除元素

if(Q->front == Q->rear)

return ERROR;

*e=Q->data[Q->front];

Q->front=(Q->front+1)%QMAXSIZE;

return OK;

}

Status QueueEmpty(SqQueue *Q)

{//判断队列是否为空

if(Q->front==Q->rear)

return OK;

else

return ERROR;

}

void TraversalSq(SqQueue Q)

{//遍历队列

ElemType s;

do

{

DeQueue(&Q,&s);

printf("%d\t",s);

}

while(!QueueEmpty(&Q));

printf("\n");

}

void main()

{

SqQueue Q;

ElemType e;

if(InitQueue(&Q))

printf("队列构造成功!\n");

else

printf("队列构造失败!\n");

while(e!=0)

{

printf("请输入要插入的数据:");

scanf("%d",&e);

if(e==0)

break;

if(EnQueue(&Q,e))

printf("入队成功!\n");

else

printf("入队失败!\n");

}

printf("队列长度为:%d\n",QueueLength(Q));

printf("队头元素为:%d\n",GetHead(Q));

TraversalSq(Q);

if(!QueueEmpty(&Q))

printf("队列不为空!\n");

else

printf("队列为空!\n");

}

杨辉三角;

#include "stdio.h"

#include "malloc.h"

#define OK 1

#define OVERFLOW -1

#define ERROR 0

#define QMAXSIZE 23//定义长度,长度>=输出行数+3

typedef int ElemType;

typedef int Status;

typedef struct

{

ElemType data[ QMAXSIZE ];//定义数据域

ElemType *base; //初始化的动态分配存储空间

int front; //头指针,队列不空指向队列头元素

int rear; //尾指针,队列不空指向队列尾元素下一位置}SqQueue;

Status InitQueue(SqQueue *Q)

{//构造空队列

Q->base=(ElemType *)malloc(QMAXSIZE * sizeof(ElemType));//分配空间if(!Q->base)

return ERROR;

Q->front=Q->rear=0;

return OK;

}

Status QueueLength(SqQueue Q)

{//获取队列长度

return (Q.rear-Q.front+QMAXSIZE)%QMAXSIZE;

}

void GetHead(SqQueue Q,ElemType *e)

{//返回队头元素

if(Q.front == Q.rear)

*e=0;

else

*e=Q.data[Q.front];

}

Status EnQueue(SqQueue *Q,ElemType e)

{//插入元素

if((Q->rear+1)% QMAXSIZE == Q->front)

return ERROR;

Q->data[Q->rear]=e;

Q->rear=(Q->rear+1)%QMAXSIZE;

return OK;

}

Status DeQueue(SqQueue *Q,ElemType *e) {//删除元素

if(Q->front == Q->rear)

return ERROR;

*e=Q->data[Q->front];

Q->front=(Q->front+1)%QMAXSIZE;

return OK;

}

Status QueueEmpty(SqQueue *Q)

{//判断队列是否为空

if(Q->front==Q->rear)

return OK;

else

return ERROR;

}

void TraversalSq(SqQueue Q,ElemType n) {//遍历队列

ElemType s;

printf("第%d行:",n);

do

{

DeQueue(&Q,&s);

printf("%d\t",s);

}

while(!QueueEmpty(&Q));

printf("\n");

void YangHui(int n)

{//杨辉三角

SqQueue Q;

ElemType j,s,t;

printf("第1行:1\n");

InitQueue(&Q);

EnQueue(&Q,0); /*开始*/

EnQueue(&Q,1); /*第1行*/

EnQueue(&Q,1);

for(j=2;j

{

EnQueue(&Q,0); /*第j行的结束符*/

printf("第%d行:",j);

do

{

DeQueue(&Q,&s);

GetHead(Q,&t);

if(t)

printf("%d\t",t); /*非0输出,否则换行*/ else

printf("\n");

EnQueue(&Q,s+t);

}

while(t!=0); /*遇到结束符前循环*/

}

DeQueue(&Q,&s); //输出最后一行

TraversalSq(Q,j);

main()

{

ElemType n;

while(1)

{

printf("请输入输出的行数(小于等于%d):",QMAXSIZE-3);

scanf("%d",&n);

if(n<=(QMAXSIZE-3)&&n>1)

{

YangHui(n);

break;

}

else

printf("输入错误,请重新输入\n");

}

getch();

}

数据结构-实验队列的实现

贵州大学实验报告 学院:计信学院专业:网络工程班级:091班姓名XXX 学号XXXXXXXXX 实验组 5 实验时间2011.12.02 指导教师XXXXX 成绩 实验项目名称 队列的实现 实 验目的1.掌握队列的思想及其存储实现。2.掌握队列的常见算法的程序实现。 实验原理1.根据实验内容编程,上机调试、得出正确的运行程序。 2. 编译运行程序,观察运行情况和输出结果。 3. 写出实验报告(包括源程序和运行结果)。 实验内容 1.采用链式存储实现队列的初始化、入队、出队操作。 2.采用顺序存储实现循环队列的初始化、入队、出队操作。 3.在主函数中设计一个简单的菜单,分别测试上述算法。

实验数据及其步骤链式存储队列: #include #include using namespace std; typedef int ElemType; struct Queue{ ElemType *queue; int front,rear,len; int Maxsize; }; void Initqueue(Queue &Q) { cout<<"队列初始化操作"<

数据结构(C语言)队列的基本操作

实验名称:实验四队列的基本操作 实验目的 掌握队列这种抽象数据类型的特点及实现方法。 实验内容 从键盘读入若干个整数,建一个顺序队列或链式队列,并完成下列操作: (1)初始化队列; (2)队列是否为空; (3)出队; (4)入队。 算法设计分析 (一)数据结构的定义 单链表存储结构定义为: struct Node; //链表单链表 typedef struct Node *PNode; int dui; dui =1; struct Node { int info; PNode link; }; struct LinkQueue { PNode f; PNode r; }; typedef struct LinkQueue *PLinkQueue; (二)总体设计 程序由主函数、创建队列函数、判断是否为空队列函数、入队函数、出队函数、取数函数、显示队列函数、菜单函数组成。其功能描述如下: (1)主函数:调用各个函数以实现相应功能 main() { PLinkQueue a; //定义链表a int b,c,e; //b 菜单选择c选择继续输入e输入元素 do { //菜单选择 mune(); scanf("%d",&b);

switch(b) { case 1://初始化 a=create(); //初始化队列 case 2: //入队 do { printf("\n请输入需要入队的数:"); if(e!=NULL) { scanf("%d",&e); enQueue(a,e); } printf("是否继续入队?(是:1 否:0)\n"); scanf("%d",&c); } while(c==1); break; case 3: //出队 c=frontQueue(a); deQueue(a); if(dui!=0) { printf("\n出队为:%d\n",c); } dui=1; break; case 4: //显示队中元素 showQueue(a); break; case 5: return; default: printf("输入错误,程序结束!\n"); return; } } while(a!=5); { return 0; } } (三)各函数的详细设计: Function1: PLinkQueue create(void)//创队

数据结构堆栈与队列实验报告

实验二堆栈和队列 实验目的: 1.熟悉栈这种特殊线性结构的特性; 2.熟练并掌握栈在顺序存储结构和链表存储结构下的基本运算; 3.熟悉队列这种特殊线性结构的特性; 3.熟练掌握队列在链表存储结构下的基本运算。 实验原理: 堆栈顺序存储结构下的基本算法; 堆栈链式存储结构下的基本算法; 队列顺序存储结构下的基本算法; 队列链式存储结构下的基本算法; 实验内容: 第一题链式堆栈设计。要求 (1)用链式堆栈设计实现堆栈,堆栈的操作集合要求包括:初始化StackInitiate(S),非空否StackNotEmpty(S),入栈StackiPush(S,x),出栈StackPop(S,d),取栈顶数据元素StackTop(S,d); (2)设计一个主函数对链式堆栈进行测试。测试方法为:依次把数据元素1,2,3,4,5入栈,然后出栈并在屏幕上显示出栈的数据元素; (3)定义数据元素的数据类型为如下形式的结构体, Typedef struct { char taskName[10]; int taskNo; }DataType; 首先设计一个包含5个数据元素的测试数据,然后设计一个主函数对链式堆栈进行测试,测试方法为:依次吧5个数据元素入栈,然后出栈并在屏幕上显示出栈的数据元素。 第二题对顺序循环队列,常规的设计方法是使用対尾指针和对头指针,对尾指针用于指示当前的対尾位置下标,对头指针用于指示当前的対头位置下标。现要求: (1)设计一个使用对头指针和计数器的顺序循环队列抽象数据类型,其中操作包括:初始化,入队列,出队列,取对头元素和判断队列是否为空; (2)编写主函数进行测试。 程序代码: 第一题: (1)源程序"LinStack.h"如下: #define NULL 0 typedef struct snode { DataType data; struct snode *next; } LSNode; /*(1)初始化StackInitiate(LSNode ** head) */ void StackInitiate(LSNode ** head) /*初始化带头结点链式堆栈*/

数据结构实验——队列(附程序)

?、实验目的 1. 了解队列的特性。 2. 掌握队列的顺序表示和实现。 3. 掌握队列的链式表示和实现。 1、实验内容 实验3. 3队列的顺序表示和实现 编写一个程序实现顺序队列的各种基本运算(采用循环队列), 主程序,完成如下功能: ⑴ 初始化队列。 ⑵ 建立顺序队列。 ⑶ 入队。 ⑷ 岀队。 (5) 判断队列是否为空。 ⑹ 取队头元素。 (7) 遍历队列。 实验3.4队列的链式表示和实现 编写一个程序实现链队列的各种基本运算,并在此基础上设计 能: (1) 初始化并建立链队列 ⑵ 入链队列。 ⑶ 岀链队列。 ⑷ 遍历链队列。 #i nclude #in clude #defi ne MAXQSIZE 100 typedef struct { int *base; int front; int rear; }SqQueue;实验三队列 并在此基础上设计一个 个主程序,完成如下功

int Ini tQueue(SqQueue &Q) { Q.base=(i nt*)malloc(MAXQSIZE*sizeof(i nt)); if(!Q.base)exit(O); Q.fro nt=Q.rear=0; return 0; }//初始化顺序队列 int QueueLe ngth(SqQueue Q) { int i; i=(Q.rear-Q.fro nt+MAXQSIZE)%MAXQSIZE; printf(“队列长度%5d\n",i); if(i)printf(" 队列非空“); else printf(" 队列为空"); return 0; }//判断队列是否为空 int En Queue(SqQueue &Q,i nt e) { if((Q.rea 叶1)%MAXQSIZE==Q.fro nt)return 0; Q.base[Q.rear]=e; Q.rear=(Q.rea r+1)%MAXQSIZE; return 0; }//将元素e入队 int DeQueue(SqQueue & Q,i nt e) { if(Q.fro nt==Q.rear)return 0; e=Q.base[Q.fro nt]; prin tf("%5d\n",e); Q.fron t=(Q.fr on t+1)%MAXQSIZE; return 0; }// 删除元素e并返回其值

数据结构-队列实验报告

《数据结构》课程实验报告 一、实验目的和要求 (1)熟悉C语言的上机环境,进一步掌握C语言的结构特点。 (2)掌握队列的顺序表示和实现。 二、实验环境 Windows7 ,VC 三、实验内容及实施 实验三:队列 【实验要求】 构建一个循环队列, 实现下列操作 1、初始化队列(清空); 2、入队; 3、出队; 4、求队列长度; 5、判断队列是否为空; 【源程序】 #include #define MAXSIZE 100 #define OK 1; #define ERROR 0; typedef struct { int *base; int front; int rear; }SqQueue;//队列的存储结构 int InitQueue(SqQueue &Q) {

Q.base=new int[MAXSIZE]; Q.front=Q.rear=0; return OK; }//队列的初始化 int EnQueue(SqQueue &Q,int e) { if((Q.rear+1)%MAXSIZE==Q.front) return ERROR; Q.base[Q.rear]=e; Q.rear=(Q.rear+1)%MAXSIZE; return OK; }//队列的入队 int DeQueue(SqQueue &Q,int &e) { if(Q.front==Q.rear) return ERROR; e=Q.base[Q.front]; Q.front=(Q.front+1)%MAXSIZE; return OK; }//队列的出队 int QueueLength(SqQueue &Q) { int i; i=(Q.rear-Q.front+MAXSIZE)%MAXSIZE; return i; }//求队列长度 void JuQueue(SqQueue &Q) { if(Q.rear==Q.front) printf("队列为空"); else printf("队列不为空"); }//判断队列是否为空 void QueueTraverse(SqQueue &Q)

数据结构——队列的应用

软件学院 上机实验报告 课程名称:数据结构 实验项目:队列的应用 实验室:耘慧420 姓名:学号 专业班级:实验时间: 2016.11.17

一、实验目的及要求 (一) 目的 1.掌握栈队列特点及顺序存储结构(循环队列)下基本操作的实现。 2.掌握队列的应用,能根据问题特点选择队列结构。 (二).要求 1.定义循环队列的存储结构 2.完成入队、出队、取队头等基本操作的实现。 3.利用队列的基本操作实现n行杨辉三角的输出。 4.主函数调用杨辉三角输出函数,实现n行杨辉三角输出。 二、性质 设计性 三、实验学时 2学时 四、实验环境 C与C++程序设计学习与实验系统 五、实验内容及步骤 (一).内容 1.定义循环队列的存储结构,完成入队、出队、取队头等基本操作的实现。 2. 利用循环队列实现杨辉三角的输出 (二).步骤 1.//---------循环队列—队列的顺序存储结构 ----- #define MAXSIZE 100

typedef struct { QElemType *base; //初始化的动态分配存储空间 int front; //头指针,队列不空指向队列头元素 int rear; //尾指针,队列不空指向队列尾元素下一位置 } SqQueue; 2.杨辉三角: 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 …………………… 这是一个初等数学中讨论的问题。系数表中的第 k行有 k个数,除了第一个和最后一个数为1之外,其余的数则为上一行中位其左、右的两数之和。 如果要求计算并输出杨辉三角前n行的值,则队列的最大空间应为 n+2。假设队列中已存有第 k 行的计算结果,并为了计算方便,在两行之间添加一个"0"作为行界值,则在计算第 k+1 行之前,头指针正指向第 k 行的"0",而尾元素为第 k+1 行的"0"。由此从左到右依次输出第 k 行的值,并将计算所得的第 k+1 行的值插入队列的基本操作为: void YangHui(int n) { printf("1\n"); EnQueue(&q,0); /*开始*/ EnQueue(&q,1); /*第1行*/ EnQueue(&q,1); for(j=2;j<=n;j++) { EnQueue(&q,0); do{

数据结构实验4队列

实验4 病人看病模拟程序 【问题描述】 编写一个程序,反映病人到医院看病,排队看医生的情况。在病人排队的过程中,主要重复两件事: (1)病人到达诊室,将病历本交给护士,排到等待队列中候诊。(2)护士从等待队列中取出下一位病人的病历,该病人进入诊室就诊。 要求模拟病人等待就诊这一过程。程序采用菜单方式,其选项及功能说明如下: (1)排队――输入排队病人的病历号,加入病人排队队列中。(2)就诊――病人排队队列中最前面的病人就诊,并将其从队列中删除; (3)查看排队――从对首到队尾列出所有的排队病人的病历号;(4)不再排队,余下一次就诊――从对首到队尾列出所有的排队病人的病历号,并退出运行; (5)下班――退出运行; #include #include typedef struct qnode { int data; struct qnode *next; }QNode; //链队结点类型

typedef struct { QNode *front,*rear; }QuType; //链队类型 void seedoctor() //模拟病人看病的过程 { int sel,flag=1,find,no; QuType *qu; QNode *p; qu=(QuType *)malloc(sizeof(QuType)); //创建空队 qu->front=qu->rear=NULL; while(flag==1) { printf("1:排队 2:就诊 3:查看排队 4:不再排队,余下依次就诊 5:下班请选择:"); scanf("%d",&sel); switch(sel) { case 1: printf(">>输入病历号:"); do { scanf("%d",&no); find=0;

数据结构第三章栈和队列习题及答案

习题三栈和队列 一单项选择题 1. 在作进栈运算时,应先判别栈是否(① ),在作退栈运算时应先判别栈是否(② )。当栈中元素为n个,作进栈运算时发生上溢,则说明该栈的最大容量为(③ )。 ①, ②: A. 空 B. 满 C. 上溢 D. 下溢 ③: A. n-1 B. n C. n+1 D. n/2 2.若已知一个栈的进栈序列是1,2,3,…,n,其输出序列为p1,p2,p3,...,pn,若p1=3,则p2为( )。 A 可能是2 B 一定是2 C 可能是1 D 一定是1 3. 有六个元素6,5,4,3,2,1 的顺序进栈,问下列哪一个不是合法的出栈序列?() A. 5 4 3 6 1 2 B. 4 5 3 1 2 6 C. 3 4 6 5 2 1 D. 2 3 4 1 5 6 4.设有一顺序栈S,元素s1,s2,s3,s4,s5,s6依次进栈,如果6个元素出栈的顺序是s2,s3,s4, s6, s5,s1,则栈的容量至少应该是() A.2 B. 3 C. 5 D.6 5. 若栈采用顺序存储方式存储,现两栈共享空间V[1..m],top[i]代表第i个栈( i =1,2)栈顶,栈1的底在v[1],栈2的底在V[m],则栈满的条件是()。 A. |top[2]-top[1]|=0 B. top[1]+1=top[2] C. top[1]+top[2]=m D. top[1]=top[2] 6. 执行完下列语句段后,i值为:() int f(int x) { return ((x>0) ? x* f(x-1):2);} int i ; i =f(f(1)); A.2 B. 4 C. 8 D. 无限递归 7. 表达式3* 2^(4+2*2-6*3)-5求值过程中当扫描到6时,对象栈和算符栈为(),其中^为乘幂。 A. 3,2,4,1,1;(*^(+*- B. 3,2,8;(*^- C. 3,2,4,2,2;(*^(- D. 3,2,8;(*^(- 8. 用链接方式存储的队列,在进行删除运算时()。 A. 仅修改头指针 B. 仅修改尾指针 C. 头、尾指针都要修改 D. 头、尾指针可能都要修改 9. 递归过程或函数调用时,处理参数及返回地址,要用一种称为()的数据结构。 A.队列 B.多维数组 C.栈 D. 线性表 10.设C语言数组Data[m+1]作为循环队列SQ的存储空间, front为队头指针,rear为队尾指针,则执行出队操作的语句为() A.front=front+1 B. front=(front+1)% m C.rear=(rear+1)%(m+1) D. front=(front+1)%(m+1) 11.循环队列的队满条件为 ( ) A. (sq.rear+1) % maxsize ==(sq.front+1) % maxsize; B. (sq.front+1) % maxsize ==sq.rear C. (sq.rear+1) % maxsize ==sq.front D.sq.rear ==sq.front

数据结构实验4 队列的表示与操作

注意事项: 在磁盘上创建一个目录,专门用于存储数据结构实验的程序。因为机房机器有还原卡,请同学们将文件夹建立在最后一个盘中,以学号为文件夹名。 实验四队列的表示与操作 一、实验目的 1。掌握队列的掌握队列的类型定义,掌握循环队列的表示与实现方法 2.掌握队列的基本操作:判空、元素入队、出队,删除队头元素 基本操作: InitQueue()构造一个空队列Q QueueEmpty(Q) 判断队列是否为空 QueueLenght(Q)返回队列Q的元素个数,即队列的长度 GetHead(Q,&e)取队列Q的队头元素,并用e返回 InQueue(&Q,e) 将元素e入队列 OutQueue(&Q,&e)删除非空队列Q的队头元素,并用e返回其值 二、实验要求 1.认真阅读和掌握本实验的算法。 2.上机将本算法实现。 3.将程序补完整,打印出程序的运行结果,并结合程序进行分析。 三、实验内容 程序:设计一个循环队列的顺序表示和实现的演示程序 参考程序如下: #include #include typedef int DataType; #define Maxsize 100 /*最大队列长度*/ typedef struct { DataType data[Maxsize]; /*初始化的动态分配存储空间*/ int front; /*头指针,若队列不空,指向队列头素元素的前一位置*/ int rear; /*尾指针,若队列不空,指向队列尾元素位置*/ }SeqQueue,*PSeqQueue; PSeqQueue InitQueue(){ /*构造一个空队列Q*/ } int QueueEmpty(PSeqQueue Q){ /*若队列Q为空队列,则返回TRUE,否则返回FALSE*/ } int QueueLength(PSeqQueue Q){

《数据结构练习题》栈和队列

栈和队列 1 简述栈和线性表的区别。 2 简述栈和队列这两种数据结构的相同点和不同点。 3 如果进栈的元素序列为A,B,C,D,则可能得到的出栈序列有多少种?写出全部的可能序列。 4 如果进栈的元素序列为1,2,3,4,5,6,能否得到4,3,5,6,1,2和1,3,5,4,2,6的出栈序列?并说明为什么不能得到或如何得到。 5 写出下列程序段的运行结果(栈中的元素类型是char): main( ) { SEQSTACK s,*p; char x, y; p = &s; initstack(p); x = ′c′; y = ′k′; push(p,x); push(p,′a′); push(p,y); x = pop(p); push(p,′t′); push(p,x); x = pop(p); push(p,′s′);

while(!empty(p)) { y = pop(p); printf(″%c″,y);} printf(″%c\n″,x); } 6 将一个非负十进制整数转换成二进制数,用非递归算法和递归算法来实现。 7 写一算法将一顺序栈中的元素依次取出,并打印元素值。 8 设单链表中存放着n个字符,试编一算法,判断该字符串是否有中心对称关系,例如xyzzyx,xyzyx都算是中心对称的字符串。 9 写出下列程序段的运行结果(队列中的元素类型是char): main( ) { SEQQUEUE a, *q; char x, y; q = &a; x=′e′; y=′c′; initqueue(q); enqueue(q,′h′); enqueue(q,′r′); enqueue(q,y); x = dequeue(q);

数据结构_实验三_栈和队列及其应用

实验编号:3四川师大《数据结构》实验报告2016年10月29日 实验三栈与队列及其应用_ 一.实验目得及要求 (1)掌握栈与队列这两种特殊得线性表,熟悉它们得特性,在实际问题背景下灵活运用它们; (2)本实验训练得要点就是“栈”得观点及其典型用法; (3)掌握问题求解得状态表示及其递归算法,以及由递归程序到非递归程序得转化方法。 二.实验内容 (1)编程实现栈在两种存储结构中得基本操作(栈得初始化、判栈空、入栈、出栈等); (2)应用栈得基本操作,实现数制转换(任意进制); (3)编程实现队列在两种存储结构中得基本操作(队列得初始化、判队列空、入队列、出队列); (4)利用栈实现任一个表达式中得语法检查(括号得匹配)。 (5)利用栈实现表达式得求值。 注:(1)~(3)必做,(4)~(5)选做。 三.主要仪器设备及软件 (1)PC机 (2)Dev C++ ,Visual C++, VS2010等 四.实验主要流程、基本操作或核心代码、算法片段(该部分如不够填写,请另加附页)(1)编程实现栈在两种存储结构中得基本操作(栈得初始化、判栈空、入栈、出栈等); A、顺序储存: ?代码部分: //Main、cpp: #include"SStack、h" int main() { SqStack S; SElemType e;

int elect=1; InitStack(S); cout << "已经创建一个存放字符型得栈" << endl; while (elect) { Muse(); cin >> elect; cout << endl; switch (elect) { case 1: cout << "input data:"; cin >> e; Push(S, e); break; case 2: if(Pop(S, e)) {cout << e <<" is pop"<< endl; } else{cout<<"blank"<

数据结构栈和队列实验报告.doc

南京信息工程大学实验(实习)报告 实验(实习)名称栈和队列日期2017.11.8 得分指导老师崔萌萌 系计算机系专业软件工程年级2016 班次(1) 姓名学号 一、实验目的 1、学习栈的顺序存储和实现,会进行栈的基本操作 2、掌握递归 3、学习队列的顺序存储、链式存储,会进行队列的基本操作 4、掌握循环队列的表示和基本操作 二、实验内容 1、用栈解决以下问题: (1)对于输入的任意一个非负十进制数,显示输出与其等值的八进制数,写出程序。(2)表达式求值,写出程序。 2、用递归写出以下程序: (1)求n!。 (2)汉诺塔程序,并截图显示3、4、5个盘子的移动步骤,写出移动6个盘子的移动次数。

3、编程实现:(1)创建队列,将asdfghjkl依次入队。(2)将队列asdfghjkl依次出队。 4、编程实现创建一个最多6个元素的循环队列、将ABCDEF依次入队,判断循环队列是否队满。 三、实验步骤 1.栈的使用 1.1 用栈实现进制的转换: 代码如下: #include #include using namespace std; int main() { stack s; //栈s; int n,radix; printf("请输入要转换的十进制非负整数: "); scanf("%d",&n); printf("请输入目标进制: "); scanf("%d",&radix);

printf("转换为%d进制: ",radix); while(n) { s.push(n%radix); n /= radix; } while(!s.empty()) { //非空 printf("%d",s.top()); s.pop(); } printf("\n"); return 0; } 运行结果如下: 2.2 求表达式的值 代码如下: #include #include #include #include #define true 1 #define false 0 #define OPSETSIZE 8 typedef int Status;

《数据结构》习题集:第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)(注:当有头结点选B) 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,则队列的输出序列是(C) 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,则判定此循环 队列为空的条件是(C) 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,则判定此循环 队列为满的条件是(C) 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 的值分别为(B) A、1,5 B、2, 4 C、4,2 D、5,1 11.用单链表表示的链式队列的队头在链表的(A)位置 A、链头 B、链尾 C、链中 12.判定一个链队列Q(最多元素为n 个)为空的条件是(A) 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 所指结点需顺序执行的指令是(B) 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 中,删除一个结点需要执行的指令是(C)

数据结构-栈和队列-实验

实验三栈和队列 一、目的和要求 1. 掌握栈和队列的逻辑结构定义和各种存储结构的实现。 2. 熟练运用栈和队列的各种存储结构以及各种基本操作。 3. 根据实际问题的需要,选择栈和队列适合的存储结构解决问题。 二、实验环境 1.WindowsXP操作系统; 2.DEV C++、Visual C++6.0语言环境; 三、实验内容 (一)验证性实验(第1、4题为一组;第2、3题为另一组,每个同学选择一组完成。每个小题一个文件夹,所有文件夹打在一个包中,文件名:“学号”+“姓名”,例如: 13131000张三.rar 。提交码为2014DS3,截止时间:2014年12月14日12:00时。) 1.顺序栈的验证 (1)定义一个结构体,描述停车场中车辆的信息。车辆信息包括:车牌号(8个字符)、进场时间(年、月、日、时、分、秒)。用描述车辆信息的结构体作为栈的数据元素类型测试顺序栈的实现。 (2)修改顺序栈的入栈成员函数push(x),要求当栈满时,执行私有成员函数stackfull( )进行栈满处理。其功能是:动态创建一个比原来的栈数组大一倍的新数组,代替原来的栈数组,原来栈数组中的元素占据新数组的前半部分的位置。 2.链式栈的验证 (1)定义一个结构体,描述停车场中车辆的信息。车辆信息包括:车牌号(8个字符)、进场时间(年、月、日、时、分、秒)。用描述车辆信息的结构体作为栈的数据元素类型测试链式栈的实现。 (2)修改链式栈模板类,用带头结点的单链表作为栈的存储结构。 3.循环队列的验证 (1)定义一个结构体,描述银行排队系统中的客户信息。客户信息包括:客户号、客户类型(企业客户、VIP客户、普通客户)、到达时间(年、月、日、时、分、秒)等。用描述客户信息的结构体作为队列的数据元素类型测试循环队列的实现。 (3)修改教材中循环队列模板类,把成员数据rear改为length表示队列长度,完成修改后各成员函数的实现,并进行测试验证。 4.链队列的验证 (1)定义一个结构体,描述航空订票系统中的航班信息。航班信息包括:航班号、起飞时间(年、月、日、时、分、秒)、起飞地点(8个字符)、抵达时间(年、月、日、时、分、秒)、抵达地点(8个字符)、座位数、空位数、票价等。用描述航班信息的结构体作为队列的数据元素类型测试链队列的实现。 (2)修改教材中的链队列模板类,用一个不带头结点的单循环链表来表示队列(也称为循环链队列),其中只设一个队尾指针rear,不设队头指针,队尾指针rear指向队尾元素结点。

数据结构实验——队列(附程序)

实验三队列 一、实验目的 1.了解队列的特性。 2.掌握队列的顺序表示和实现。 3.掌握队列的链式表示和实现。 二、实验内容 实验3. 3队列的顺序表示和实现 编写一个程序实现顺序队列的各种基本运算(采用循环队列),并在此基础上设计一个主程序,完成如下功能: (1)初始化队列。 (2)建立顺序队列。 (3)入队。 (4)出队。 (5)判断队列是否为空。 (6)取队头元素。 (7)遍历队列。 实验3.4队列的链式表示和实现 编写一个程序实现链队列的各种基本运算,并在此基础上设计一个主程序,完成如下功能: (1)初始化并建立链队列。 (2)入链队列。 (3)出链队列。 (4)遍历链队列。 #include #include #define MAXQSIZE 100 typedef struct { int *base; int front; int rear; }SqQueue;

int InitQueue(SqQueue &Q) { Q.base=(int*)malloc(MAXQSIZE*sizeof(int)); if(!Q.base)exit(0); Q.front=Q.rear=0; return 0; }//初始化顺序队列 int QueueLength(SqQueue Q) { int i; i=(Q.rear-Q.front+MAXQSIZE)%MAXQSIZE; printf("队列长度%5d\n",i); if(i)printf(" 队列非空"); else printf(" 队列为空"); return 0; }//判断队列是否为空 int EnQueue(SqQueue &Q,int e) { if((Q.rear+1)%MAXQSIZE==Q.front)return 0; Q.base[Q.rear]=e; Q.rear=(Q.rear+1)%MAXQSIZE; return 0; }//将元素e入队 int DeQueue(SqQueue &Q,int e) { if(Q.front==Q.rear)return 0; e=Q.base[Q.front]; printf("%5d\n",e); Q.front=(Q.front+1)%MAXQSIZE; return 0; }// 删除元素e并返回其值

数据结构--04队列的基本操作

《数据结构》实验报告 院系光电与信息工程学院专业电子信息工程 姓名学号电话 2011级 2班 2013年4月20日 1.实验题目 实验4 .对列的基本操作 2.需求分析 (1)编写链接队列的基本操作函数,调用上述函数实现下列操作,操作步骤如下:调用进队函数建立一个队列。读取队列中的第一个元素。从队列中删除元素。输出队列中的所有元素。 (2)编写环型队列的基本操作函数。调用上述函数实现下列操作,操作步骤如下: 调用进队函数建立一个队列。 读取队列中的第一个元素。 从队列中删除元素。 输出队列中的所有元素。 链接队列: ①进队操作 EnQueue(LinkQueue *Q, QElemType e) ②出队操作,队空 DeQueue(LinkQueue *Q, QElemType *e) ③输出队列中元素 0utputQueue(LinkQueue Q) 环型队列: ①进队操作,返回1为队满 EnQueue(SqQueue *Q, QElemType e) ②出队操作,返回1为队空 DeQueue(SqQueue *Q, QElemType *e) ③输出队列中元素 outPutQMeue(SqQueue Q) 输入形式:整型数。 3.概要设计 (1)链接队列 ADT QNode{ 数据对象:D={a i|a i∈IntegerSet,i=0,1,2,…,n,n≥0} 结构关系:R={|a i,a i+1 ∈D} 基本操作: InitQueue(LinkQueue *Q) 操作前提:Q是一个未初始化的链接队列 操作结果:将Q初始化为一个空的链接队列 EnQueue(LinkQueue *Q, QElemType e) 操作前提:链接队列Q已存在 操作结果:将元素e插入到链接队列中 DeQueue(LinkQueue *Q, QElemType *e) 操作前提:链接队列Q已存在 操作结果:将链接队列Q中队头元素删除,删除的元素值通过e返回 0utputQueue(LinkQueue Q)

《数据结构》实验二 栈和队列

《数据结构》实验指导及报告书 2014 / 2015 学年第 1学期 姓名: 学号: 班级: 指导教师:徐江 计算机科学与工程学院 2014

实验二栈和队列 一、实验目的 1、掌握栈的结构特性及其入栈,出栈操作; 2、掌握队列的结构特性及其入队、出队的操作,掌握循环队列的特点及其操作。 二、实验内容和要求 1、阅读下面程序,将函数Push和函数Pop补充完整。要求输入元素序列1 2 3 4 5 e,运行结果如下所示。 #include #include #define ERROR 0 #define OK 1 #define STACK_INT_SIZE 10 /*存储空间初始分配量*/ #define STACKINCREMENT 5 /*存储空间分配增量*/ typedef int ElemType; /*定义元素的类型*/ typedef struct{ ElemType *base; ElemType *top; int stacksize; /*当前已分配的存储空间*/ }SqStack; int InitStack(SqStack *S); /*构造空栈*/ int push(SqStack *S,ElemType *e); /*入栈*/ int Pop(SqStack *S,ElemType *e); /*出栈*/ int CreateStack(SqStack *S); /*创建栈*/ void PrintStack(SqStack *S); /*出栈并输出栈中元素*/ int InitStack(SqStack *S){ S->base=(ElemType *)malloc(STACK_INT_SIZE *sizeof(ElemType)); if(!S->base) return ERROR;

数据结构详细教案——栈和队列

数据结构教案 第三章栈和队列

目录 3.1栈的基本概念 (2) 3.1.1 栈的抽象数据类型定义 (2) 3.1.2 顺序栈 (2) 3.1.3 链栈 (4) 3.2栈的应用 (4) 3.2.1 数制转换:将十进制数N转换成其他d进制数 (4) 3.2.2 括号匹配的检验 (4) 3.2.3 行输入处理程序 (4) 3.2.4 迷宫求解 (5) 3.2.5 表达式求值 (5) 3.3栈与递归的实现 (6) 3.4队列的基本概念 (6) 3.4.1 队列的抽象数据类型定义 (6) 3.4.2 链队列 (7) 3.4.3 循环队列 (8) 3.5队列与栈的应用 (8) 3.5.1 离散事件模拟 (8)

第3章栈和队列 3.1 栈的基本概念 3.1.1 栈的抽象数据类型定义 1、栈的逻辑特征 1)限定在表尾进行插入或删除操作的线性表; 2)栈顶——表尾端;栈底——表头端 3)后进先出的线性表 2、抽象数据类型的定义 ADT Stack{ 数据对象:D={a i |a i∈ElemSet, i=1,2,…,n, n≥0} 数据关系:R={R1},R1={|a i-1,a i∈D, i=2,3,…,n } 基本操作: InitStack( &S ) 操作结果:构造一个空的栈S DestroyStack( &S ) 初始条件:栈S已存在 操作结果:销毁栈S ClearStack( &S ) 初始条件:栈S已存在 操作结果:将栈S重置为空栈 StackEmpty( S ) 初始条件:栈S已存在 操作结果:若S为空栈,则返回TRUE,否则返回FALSE StackLength( S ) 初始条件:栈S已存在 操作结果:返回栈S中数据元素的个数 GetTop( S, &e ) 初始条件:栈S已存在且非空 操作结果:用e返回S中栈顶元素 Push( &S, e ) 初始条件:栈S已存在 操作结果:插入元素e为新的栈顶元素 Pop( &S, &e ) 初始条件:栈S已存在且非空 操作结果:删除S的栈顶元素,并用e返回其值 StackTraverse( S, visit( ) ) 初始条件:栈S已存在且非空 操作结果:从栈底到栈顶依次对S的每个数据元素调用函数visit( )。一 旦visit( )失败,则操作失败 }ADT Stack 思考:栈的取元素、插入、删除操作与线性表的相应操作有何区别,为什么? 3.1.2 顺序栈

数据结构 队列实验报告

队列实验报告 小组成员:xxxxxxxx日期:xxxxxxxx 一、需求分析(xxx) 1.链队列 1)在本演示程序中,首先要链队列添加一个头结点,并判断队列是否为空,它只允许在表的一端进行插入,而在另一端删除元素,允许插入的一段叫队尾,允许删除的一端则为对头,接着访问队列中所有元素,并输出,输出是每个元素之间用空格来完成。最后销毁队列,释放空间。 2)演示程序以用户和计算机的对话方式执行,即在计算机终端上显示“欢迎来到链队列”“元素入队”“元素出队”“销毁队列”“清空队列”之后。由用户在键盘上输入演示程序中规定的运算命令,相应的运算数据和显示结果显示在其后。 3)程序执行的命令包括: 欢迎来到链队列 1输出队列长度 2元素入队 3元素出队 4销毁队列 5清空队列 6对头元素 7退出链队列 4)测试数据 入队 1 2 3 4 5 分别执行“元素入队”“元素出队”“销毁队列”“清空队列”等操作。 2.顺序队列 1)在本演示程序中,首先要顺序队列添加一个头结点,并判断队列是否为空,它只允许在表的一端进行插入,而在另一端删除元素,允许插入的一段叫队尾,允许删除的一端则为对头,接着访问队列中所有元素,并输出,输出是每个元素之间用空格来完成。 2)演示程序以用户和计算机的对话方式执行,即在计算机终端上显示“欢迎来到链队列”“元素入队”“元素出队”“取得头结点”“输出显示”之后。由用户在键盘上输入演示程序中规定的运算命令,相应的运算数据和显示结果显示在其后。 3)程序执行的命令包括: 欢迎来到顺序队列 1入队 2出队 3判断是否为空 4取得头结点 5输出显示 6退出顺序队列 4)测试数据 入队 1 2 3

相关文档
最新文档