当前位置:文档之家› 数据结构堆栈实验报告doc

数据结构堆栈实验报告doc

数据结构堆栈实验报告doc
数据结构堆栈实验报告doc

数据结构堆栈实验报告

篇一:数据结构-堆栈和队列实验报告

实验报告

实验二堆栈和队列

实验目的:

1.熟悉栈这种特殊线性结构的特性;

2.熟练并掌握栈在顺序存储结构和链表存储结构下的基本运算;

3.熟悉队列这种特殊线性结构的特性;

3.熟练掌握队列在链表存储结构下的基本运算。

实验原理:

堆栈顺序存储结构下的基本算法;

堆栈链式存储结构下的基本算法;

队列顺序存储结构下的基本算法;

队列链式存储结构下的基本算法;

实验内容:

3-18 链式堆栈设计。要求

(1)用链式堆栈设计实现堆栈,堆栈的操作集合要求包括:初始化StackInitiate(S),非空否StackNotEmpty(S),入栈StackiPush(S,x),出栈StackPop(S,d),取栈顶数据元素StackTop(S,d);

(2)设计一个主函数对链式堆栈进行测试。测试方法为:依次把数据元素1,2,3,4,5入栈,然后出栈并在屏幕上显示出栈的数据元素;

(3)定义数据元素的数据类型为如下形式的结构体,

Typedef struct

{

c(本文来自:小草范文网:数据结构堆栈实验报告)har taskName[10];

int taskNo;

}DataType;

首先设计一个包含5个数据元素的测试数据,然后设计一个主函数对链式堆栈进行测试,测试方法为:依次吧5个数据元素入栈,然后出栈并在屏幕上显示出栈的数据元素。

3-19 对顺序循环队列,常规的设计方法是使用対尾指针和对头指针,对尾指针用于指示当前的対尾位置下标,对头指针用于指示当前的対头位置下标。现要求:

(1)设计一个使用对头指针和计数器的顺序循环队列抽象数据类型,其中操作包括:初始化,入队列,出队列,取对头元素和判断队列是否为空;

(2)编写一个主函数进行测试。

实验结果:

3-18

typedef struct snode

{

DataType data;

struct snode *next;

} LSNode;

/*初始化操作:*/

void StackInitiate(LSNode **head)

/*初始化带头结点链式堆栈*/

{

if((*head = (LSNode *)malloc(sizeof(LSNode))) == NULL) exit(1); (*head)->next = NULL;

}

/*判非空操作:*/

int StackNotEmpty(LSNode *head)

/*判堆栈是否非空,非空返回1;空返回0*/

{

if(head->next == NULL) return 0;

else return 1;

}

/*入栈操作:*/

int StackPush(LSNode *head, DataType x)

/*把数据元素x插入链式堆栈head的栈顶作为新的栈顶 */ {

LSNode *p;

if((p = (LSNode *)malloc(sizeof(LSNode))) == NULL)

{

printf("内存空间不足无法插入! \n");

return 0;

}

p->data = x;

p->next = head->next; /*新结点链入栈顶*/ head->next = p;/*新结点成为新的栈顶*/ return 1;

}

/*出栈操作:*/

int StackPop(LSNode *head, DataType *d)

/*出栈并把栈顶元素由参数d带回*/

{

LSNode *p = head->next;

if(p == NULL)

{

printf("堆栈已空出错!");

return 0;

}

head->next = p->next;/*删除原栈顶结点*/ *d = p->data; /*原栈顶结点元素赋予d*/ free(p); /*释放原栈顶结点内存空间*/ return 1;

}

/*取栈顶数据元素操作:*/

int StackTop(LSNode *head, DataType *d)

/*取栈顶元素并把栈顶元素由参数d带回*/

{

LSNode *p = head->next;

if(p == NULL)

{

printf("堆栈已空出错!");

return 0;

}

*d = p->data;

return 1;

}

/*撤销*/

void Destroy(LSNode *head)

{

LSNode *p, *p1;

p = head;

while(p != NULL)

{

p1 = p;

p = p->next;

free(p1);

}

}(2)主函数程序:

#include

#include

typedef int DataType;

#include "LinStack.h"

void main(void)

{ LSNode *myStack;

int i, x;

StackInitiate(&myStack);

for(i=0;i { if(StackPush(myStack,i+1)==0) {

printf("error!\n");

return;

}

}

if(StackTop(myStack, &x)==0)

{

printf("error!\n");

return;

}

else

printf("The element of local top is :%d\n",x); printf( "The sequence of outing elements is:\n"); while(StackNotEmpty(myStack))

{

StackPop(myStack, &x);

printf("%d ", x);

}

printf("\n");

Destroy(myStack);

printf("This program is made by\n"); }

运行结果为:

(3)设计结构体和测试函数如下:

#include

#include

#include

typedef struct{

char taskName[10];

int taskNo;

}DataType;

#include"LinStack.h"

void main(){

LSNode *myStack;

FILE *fp;

DataType task,x;

if((fp=fopen("task.txt","r"))==NULL){

printf("不能打开文件task.txt!\n");

exit(0);

}

StackInitiate(&myStack);

while(!feof(fp)){

fscanf(fp,"%s %d",&task.taskName,&task.taskNo); StackPush(myStack,task);

}

fclose(fp);

while(StackNotEmpty(myStack)){

StackPop(myStack,&x);

printf("%s %d\n",x.taskName,x.taskNo); } Destroy(myStack);

printf("This program is made by \n");

}运行结果为:

3-19

(1)

typedef struct

{

DataType queue[MaxQueueSize];

int front; /*队头指针*/

int count;/*计数器*/

} SeqCQueue;

/*初始化操作:QueueInitiate(SeqCQueue *Q) */ void QueueInitiate(SeqCQueue *Q)

/*初始化顺序循环队列Q */

{

Q->front=0; /*定义初始队头指针下标*/

Q->count=0;/*定义初始计数器值*/

}

/*判非空否操作:QueueNotEmpty(SeqCQueue Q)*/ int QueueNotEmpty(SeqCQueue Q)

篇二:数据结构栈和队列实验报告

一、实验目的和要求

(1)理解栈和队列的特征以及它们之间的差异,知道在何时使用那种数据结构。

(2)重点掌握在顺序栈上和链栈上实现栈的基本运算算法,注意栈满和栈空的条件。

(3)重点掌握在顺序队上和链队上实现队列的基本运算算法,注意循环队队列满和队空的条件。

(4)灵活运用栈和队列这两种数据结构解决一些综合应用问题。

二、实验环境和方法

实验方法:

(一)综合运用课本所学的知识,用不同的算法实现在不同的程序功能。

(二)结合指导老师的指导,解决程序中的问题,正确解决实际中存在的异常情况,逐步改善功能。

(三)根据实验内容,编译程序。

实验环境:Windows xpVisual C++6.0

三、实验内容及过程描述

实验步骤:

①进入Visual C++ 6.0集成环境。

②输入自己编好的程序。

③检查一遍已输入的程序是否有错(包括输入时输错的和编程中的错误),如发现有

错,及时改正。

④进行编译和连接。如果在编译和连接过程中发现错误,频幕上会出现“报错信息”,

根据提示找到出错位置和原因,加以改正。再进行编译,如此反复直到不出错为止。⑤运行程序并分析运行结果是否合理。在运行是要注意当输入不同的数据时所得结果是否正确,应运行多次,分别检查在不同情况下结果是否正确。

实验内容:编译以下题目的程序并调试运行。

1)、编写一个程序algo3-1.cpp,实现顺

的各种基本运算,并在此基础上设计一

程序并完成如下功能:

(1)初始化栈s;

(2)判断栈s是否非空;序栈个主

(3)依次进栈元素a,b,c,d,e;

(4)判断栈s是否非空;

(5)输出出栈序列;

(6)判断栈s是否非空;

(7)释放栈。图3.1 Proj3_1 工程组成

本工程Proj3_1的组成结构如图3.1所示。本工程的模块结构如图3.2所示。图中方框表示函数,方框中指出函数名,箭头方向表示函数间的调用关系。

图3.2 Proj3_1工程的程序结构图

其中包含如下函数:

InitStack(SqStack *&s) //初始化栈S

DestroyStack(SqStack *&s) //销毁栈s

StackEmpty(SqStack *s) //判断栈空

Push(SqStack *&s,ElemType e) //进栈

Pop(SqStack *&s,ElemType &e) //出栈

GetTop(SqStack *s,ElemType &e) //取栈顶元素

对应的程序如下:

//文件名:algo3-1.cpp

#include

#include

#define MaxSize 100

typedef char ElemType;

typedef struct

{

ElemType data[MaxSize];

int top; //栈顶指针

} SqStack;

void InitStack(SqStack *&s) //初始化栈S

{ s=(SqStack *)malloc(sizeof(SqStack));

s->top=-1; //栈顶指针置为-1

}

void DestroyStack(SqStack *&s) //销毁栈s

{

free(s);

}

bool StackEmpty(SqStack *s) //判断栈空

{

return(s->top==-1);

}

bool Push(SqStack *&s,ElemType e) //进栈

{ if (s->top==MaxSize-1) //栈满的情况,即栈上溢出

return false;

s->top++; //栈顶指针增1

s->data[s->top]=e; //元素e放在栈顶指针处

return true;

}

bool Pop(SqStack *&s,ElemType &e) //出栈

{ if (s->top==-1) //栈为空的情况,即栈下溢出

return false;

e=s->data[s->top]; //取栈顶指针元素的元素

s->top--;//栈顶指针减1

return true;

}

bool GetTop(SqStack *s,ElemType &e) //取栈顶元素

{ if (s->top==-1) //栈为空的情况,即栈下溢出

return false;

e=s->data[s->top]; //取栈顶指针元素的元素

return true;

}

设计exp3-1.cpp程序如下 //文件名:exp3-1.cpp

#include

#include

#define MaxSize 100

typedef char ElemType;

typedef struct

{

ElemType data[MaxSize];

int top; //栈顶指针

} SqStack;

extern void InitStack(SqStack *&s);

extern void DestroyStack(SqStack *&s); extern bool StackEmpty(SqStack *s);

extern bool Push(SqStack *&s,ElemType e); extern bool Pop(SqStack *&s,ElemType &e); extern bool GetTop(SqStack *s,ElemType &e); void main()

{

ElemType e;

SqStack *s;

printf("栈s的基本运算如下:\n");

printf(" (1)初始化栈s\n");

InitStack(s);

printf(" (2)栈为%s\n",(StackEmpty(s)?"空":"非空"));

printf(" (3)依次进栈元素a,b,c,d,e\n");

Push(s,'a');

Push(s,'b');

Push(s,'c');

Push(s,'d');

Push(s,'e');

printf(" (4)栈为%s\n",(StackEmpty(s)?"空":"非空"));

printf(" (5)出栈序列:");

while (!StackEmpty(s))

{

Pop(s,e);

printf("%c ",e);

}

printf("\n");

printf(" (6)栈为%s\n",(StackEmpty(s)?"空":"非空"));

printf(" (7)释放栈\n");

DestroyStack(s);

}

运行结果如下:

2)、编写一个程序algo3-2.cpp,实现链栈的各种基本运算,并在此基础上设计一个主程序并完成如下功能:(1)初始化链栈s;

(2)判断链栈s是否非空;

(3)依次进栈a,b,c,d,e;

(4)判断链栈s是否非空;

(5)输出链栈长度;

(6)输出从栈底到栈顶元素;

(7)输出出队序列;

(8)判断链栈s是否非空;图3.3 Proj3_2工程组成(9)释放队列。

本工程Proj3_2的组成结构如图3.3所示。本工程的模块结构如图3.4所示。图中方框表示函数,方框中指出函数名,箭头方向表示函数间的调用关系。

图3.4 Proj3_2工程的程序结构图

其中包含如下函数:

InitStack(LiStack *&s) //初始化栈s

DestroyStack(LiStack *&s) //销毁栈

StackEmpty(LiStack *s) //判断栈是否为空

Push(LiStack *&s,ElemType e) //进栈

Pop(LiStack *&s,ElemType &e) //出栈

GetTop(LiStack *s,ElemType &e) //取栈顶元素

对应的程序如下:

//文件名:algo3-2.cpp

#include

#include

typedef char ElemType;

typedef struct linknode

{

ElemType data; //数据域

篇三:数据结构栈与队列的实验报告

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

学院:数学与计算机学院班级:计算机科学与技术姓名:杨理源

学号:XX

实验三栈与队列

一、实验目的:

(1)熟练掌握栈和队列的结构以及这两种数据结构的特点、栈与队列的基本操作。

(2)能够在两种存储结构上实现栈的基本运算,特别

注意栈满和栈空的判断条件及描述方法;

(3)熟练掌握链队列和循环队列的基本运算,并特别注意队列满和队列空的判断条件和描述方法;

(4)掌握栈的应用;

二、实验要求:

(1) 给出程序设计的基本思想、原理和算法描述。

(2) 对源程序给出注释。

(3) 记录程序的运行结果,并结合程序进行分析。

三、程序设计的基本思想、原理和算法描述:

四、实验内容:

1、利用栈的基本操作将一个十进制的正整数转换成R 进制数据,并将其转换结果输出。 #include

#include

#include

#define stack_init_size 100

#define stackincrement 10

typedef struct sqstack {

int *base;

int *top;

int stacksize;

} sqstack;

int StackInit(sqstack *s)

{s->base=(int *)malloc(stack_init_size *sizeof(int));

if(!s->base)

return 0;

s->top=s->base;

s->stacksize=stack_init_size;

return 1;

}

int Push(sqstack *s,int e)

{

if(s->top-s->base>=s->stacksize)

{

s->base=(int *)realloc(s->base,(s->stacksize+stackincrement)*siz eof(int));if(!s->base)

return 0;

s->top=s->base+s->stacksize;

s->stacksize+=stackincrement;

}

*(s->top++)=e;

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

实验二堆栈和队列 实验目的: 1.熟悉栈这种特殊线性结构的特性; 2.熟练并掌握栈在顺序存储结构和链表存储结构下的基本运算; 3.熟悉队列这种特殊线性结构的特性; 3.熟练掌握队列在链表存储结构下的基本运算。 实验原理: 堆栈顺序存储结构下的基本算法; 堆栈链式存储结构下的基本算法; 队列顺序存储结构下的基本算法;队列链式存储结构下的基本算法;实验内容: 3-18链式堆栈设计。要求 (1)用链式堆栈设计实现堆栈,堆栈的操作集合要求包括:初始化Stacklnitiate (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个数据元素入栈,然后出栈并在屏幕上显示出栈的数据元素。 3-19对顺序循环队列,常规的设计方法是使用対尾指针和对头指针,对尾指针用于指示当 前的対尾位置下标,对头指针用于指示当前的対头位置下标。现要求: (1)设计一个使用对头指针和计数器的顺序循环队列抽象数据类型,其中操作包括:初始化,入队列,出队列,取对头元素和判断队列是否为空; (2)编写一个主函数进行测试。 实验结果: 3-18 typedef struct snode { DataType data; struct snode *n ext; } LSNode; /* 初始化操作:*/

数据结构实验报告格式

《数据结构课程实验》大纲 一、《数据结构课程实验》的地位与作用 “数据结构”是计算机专业一门重要的专业技术基础课程,是计算机专业的一门核心的关键性课程。本课程较系统地介绍了软件设计中常用的数据结构以及相应的存储结构和实现算法,介绍了常用的多种查找和排序技术,并做了性能分析和比较,内容非常丰富。本课程的学习将为后续课程的学习以及软件设计水平的提高打下良好的基础。 由于以下原因,使得掌握这门课程具有较大的难度: (1)内容丰富,学习量大,给学习带来困难; (2)贯穿全书的动态链表存储结构和递归技术是学习中的重点也是难点; (3)所用到的技术多,而在此之前的各门课程中所介绍的专业性知识又不多,因而加大了学习难度; (4)隐含在各部分的技术和方法丰富,也是学习的重点和难点。 根据《数据结构课程》课程本身的技术特性,设置《数据结构课程实验》实践环节十分重要。通过实验实践内容的训练,突出构造性思维训练的特征, 目的是提高学生组织数据及编写大型程序的能力。实验学时为18。 二、《数据结构课程实验》的目的和要求 不少学生在解答习题尤其是算法设计题时,觉得无从下手,做起来特别费劲。实验中的内容和教科书的内容是密切相关的,解决题目要求所需的各种技术大多可从教科书中找到,只不过其出现的形式呈多样化,因此需要仔细体会,在反复实践的过程中才能掌握。 为了帮助学生更好地学习本课程,理解和掌握算法设计所需的技术,为整个专业学习打好基础,要求运用所学知识,上机解决一些典型问题,通过分析、设计、编码、调试等各环节的训练,使学生深刻理解、牢固掌握所用到的一些技术。数据结构中稍微复杂一些的算法设计中可能同时要用到多种技术和方法,如算法设计的构思方法,动态链表,算法的编码,递归技术,与特定问题相关的技术等,要求重点掌握线性链表、二叉树和树、图结构、数组结构相关算法的设计。在掌握基本算法的基础上,掌握分析、解决实际问题的能力。 三、《数据结构课程实验》内容 课程实验共18学时,要求完成以下六个题目: 实习一约瑟夫环问题(2学时)

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

实验编号: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.顺序储存: 代码部分: 栈" << endl; cout << " 2.出栈" << endl; cout << " 3.判栈空" << endl; cout << " 4.返回栈顶部数据" << endl; cout << " 5.栈长" << endl; cout << " 0.退出系统" << endl;

cout << "你的选择是:" ; } 链式储存: 代码部分: 栈"<>select; switch (select){ case 0:break; case 1: cout<<"push data:"; cin>>e; if(push(L,e)){

数据结构实验报告

数据结构实验报告 一.题目要求 1)编程实现二叉排序树,包括生成、插入,删除; 2)对二叉排序树进行先根、中根、和后根非递归遍历; 3)每次对树的修改操作和遍历操作的显示结果都需要在屏幕上用树的形状表示出来。 4)分别用二叉排序树和数组去存储一个班(50人以上)的成员信息(至少包括学号、姓名、成绩3项),对比查找效率,并说明在什么情况下二叉排序树效率高,为什么? 二.解决方案 对于前三个题目要求,我们用一个程序实现代码如下 #include #include #include #include "Stack.h"//栈的头文件,没有用上 typedefintElemType; //数据类型 typedefint Status; //返回值类型 //定义二叉树结构 typedefstructBiTNode{ ElemType data; //数据域 structBiTNode *lChild, *rChild;//左右子树域 }BiTNode, *BiTree; intInsertBST(BiTree&T,int key){//插入二叉树函数 if(T==NULL) { T = (BiTree)malloc(sizeof(BiTNode)); T->data=key; T->lChild=T->rChild=NULL; return 1; } else if(keydata){ InsertBST(T->lChild,key); } else if(key>T->data){ InsertBST(T->rChild,key); } else return 0; } BiTreeCreateBST(int a[],int n){//创建二叉树函数 BiTreebst=NULL; inti=0; while(i

队列实验报告

一.实验项目名称 循环队列和链式队列的创建 二、实验目的 1、掌握队列的特点(先进先出FIFO)及基本操作,如入队、出队等, 2、队列顺序存储结构、链式存储结构和循环队列的实现,以便在 实际问题背景下灵活应用。 三、实验内容 1.链式队列的实现和运算 2.循环队列的实现和运算 四、主要仪器设备及耗材 VC++6.0运行环境实现其操作 五.程序算法 (1) 循环队列操作的算法 1>进队列 V oid enqueue (seqqueue &q, elemtype x) { if ((q.rear+1)%maxsize = = q.front) cout<<”overflow”; else { q.rear=(q.rear+1)%maxsize; //编号加1或循环回第一个单元 q.queue[q.rear]=x; } } 2>出队列 V oid dlqueue(seqqueue &q ) { if (q.rear= =q.front) cout<<”underflow”; else q.front =(q.front+1)%maxsize; } 3>取对头元素

elemtype gethead(seqqueue q ) { if (q.rear= =q.front) { cout<<”underflow”; return NULL;} else return q.queue[(q.front+1)%maxsize]; //front指向队头前一个位置 } 4>判队列空否 int empty(seqqueue q ) { if (q.rear= =q.front) reurn 1; else return 0; } (2).链队列操作的算法 1>.链队列上的初始化 void INIQUEUE( linkqueue &s) { link *p; p=new link; p->next=NULL; //p是结构体指针类型,用-> s.front=p; //s是结构体变量,用. s.rear=p; //头尾指针都指向头结点 } 2>.入队列 void push(linkqueue &s, elemtype x) { link *p; //p是结构体指针类型,用-> p=new link; p->data=x; p->next=s.rear->next; //s是结构体变量,用. s.rear->next=p; s.rear=p; //插入最后 } 3>判队空 int empty( linkqueue s ) { if (s.front= =s.rear) return 1; else return 0; } 4>.取队头元素 elemtype gethead( linkqueue s ) { if (s.front= =s.rear) return NULL; else retuen s.front->next->data; }

数据结构实验报告全集

数据结构实验报告全集 实验一线性表基本操作和简单程序 1.实验目的 (1)掌握使用Visual C++ 6.0上机调试程序的基本方法; (2)掌握线性表的基本操作:初始化、插入、删除、取数据元素等运算在顺序存储结构和链表存储结构上的程序设计方法。 2.实验要求 (1)认真阅读和掌握和本实验相关的教材内容。 (2)认真阅读和掌握本章相关内容的程序。 (3)上机运行程序。 (4)保存和打印出程序的运行结果,并结合程序进行分析。 (5)按照你对线性表的操作需要,重新改写主程序并运行,打印出文件清单和运行结果 实验代码: 1)头文件模块 #include iostream.h>//头文件 #include//库头文件-----动态分配内存空间 typedef int elemtype;//定义数据域的类型 typedef struct linknode//定义结点类型 { elemtype data;//定义数据域 struct linknode *next;//定义结点指针 }nodetype; 2)创建单链表

nodetype *create()//建立单链表,由用户输入各结点data域之值,//以0表示输入结束 { elemtype d;//定义数据元素d nodetype *h=NULL,*s,*t;//定义结点指针 int i=1; cout<<"建立一个单链表"<> d; if(d==0) break;//以0表示输入结束 if(i==1)//建立第一个结点 { h=(nodetype*)malloc(sizeof(nodetype));//表示指针h h->data=d;h->next=NULL;t=h;//h是头指针 } else//建立其余结点 { s=(nodetype*) malloc(sizeof(nodetype)); s->data=d;s->next=NULL;t->next=s; t=s;//t始终指向生成的单链表的最后一个节点

数据结构 实验报告三

实验三的实验报告 学期: 2010 至_2011 第 2 学期 2011年 3月 27日课程名称: 数据结构专业:信息与计算科学 09 级5班实验编号: 03 实验项目:栈和队列实验指导教师 _冯山_姓名:朱群学号: 2009060548 实验成绩: 一实验目的: (1)熟练掌握栈和队列的抽象数据类型及其结构特点; (2)实现基本的栈和队列的基本操作算法程序。 二实验内容:(类C算法的程序实现,任选其一) (1) 设计与实现基本的堆栈和队列结构下的各种操作(如堆栈的PUSH、POP 等操作)(必做); (2)以表达式计算为例,完成一个可以进行算术表达式计算功能的算法设计 与实现(选做); (3)以迷宫问题为例,以堆栈结构完成迷宫问题的求解算法和程序(选做)。三实验准备: 1) 计算机设备;2)程序调试环境的准备,如TC环境;3)实验内容的算法分 析与代码设计与分析准备。 四实验步骤: 1.录入程序代码并进行调试和算法分析; 2.编写实验报告。 五实验过程 一设计与实现基本的堆栈结构下的各种操作(如堆栈的PUSH、POP等操作)(1)问题描述 实现堆栈各种基本操作,如Pop,Push,GetTop等操作,即输入数据,通过Push入栈,再通过Pop操作输出出栈的元素,即入栈a,b,c,d,出栈d,c,b,a (2)算法实现及基本思想 堆栈是后进先出的线性表,由Push输入元素,Pop输出元素,堆栈的Push 操作思想,即插入元素e为新的的栈顶元素,先判断栈满与否,追加存储空间,然后将e值赋给栈顶指针Top。输入数据时用for循环 堆栈的Pop操作思想,先判断栈是否为空,若栈不空,则删除栈的栈顶元素,用e返回其值, (3)数据结构 栈的顺序存储结构 Typedef struct {

数据结构-队列实验报告

《数据结构》课程实验报告 一、实验目的和要求 (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)

数据结构实验报告模板

2009级数据结构实验报告 实验名称:约瑟夫问题 学生姓名:李凯 班级:21班 班内序号:06 学号:09210609 日期:2010年11月5日 1.实验要求 1)功能描述:有n个人围城一个圆圈,给任意一个正整数m,从第一个人开始依次报数,数到m时则第m个人出列,重复进行,直到所有人均出列为止。请输出n个人的出列顺序。 2)输入描述:从源文件中读取。 输出描述:依次从显示屏上输出出列顺序。 2. 程序分析 1)存储结构的选择 单循环链表 2)链表的ADT定义 ADT List{ 数据对象:D={a i|a i∈ElemSet,i=1,2,3,…n,n≧0} 数据关系:R={< a i-1, a i>| a i-1 ,a i∈D,i=1,2,3,4….,n} 基本操作: ListInit(&L);//构造一个空的单链表表L ListEmpty(L); //判断单链表L是否是空表,若是,则返回1,否则返回0. ListLength(L); //求单链表L的长度 GetElem(L,i);//返回链表L中第i个数据元素的值; ListSort(LinkList&List) //单链表排序 ListClear(&L); //将单链表L中的所有元素删除,使单链表变为空表 ListDestroy(&L);//将单链表销毁 }ADT List 其他函数: 主函数; 结点类; 约瑟夫函数 2.1 存储结构

[内容要求] 1、存储结构:顺序表、单链表或其他存储结构,需要画示意图,可参考书上P59 页图2-9 2.2 关键算法分析 结点类: template class CirList;//声明单链表类 template class ListNode{//结点类定义; friend class CirList;//声明链表类LinkList为友元类; Type data;//结点的数据域; ListNode*next;//结点的指针域; public: ListNode():next(NULL){}//默认构造函数; ListNode(const Type &e):data(e),next(NULL){}//构造函数 Type & GetNodeData(){return data;}//返回结点的数据值; ListNode*GetNodePtr(){return next;}//返回结点的指针域的值; void SetNodeData(Type&e){data=e;}//设置结点的数据值; void SetNodePtr(ListNode*ptr){next=ptr;} //设置结点的指针值; }; 单循环链表类: templateclass CirList { ListNode*head;//循环链表头指针 public: CirList(){head=new ListNode();head->next=head;}//构造函数,建立带头节点的空循环链表 ~CirList(){CirListClear();delete head;}//析构函数,删除循环链表 void Clear();//将线性链表置为空表 void AddElem(Type &e);//添加元素 ListNode *GetElem(int i)const;//返回单链表第i个结点的地址 void CirListClear();//将循环链表置为空表 int Length()const;//求线性链表的长度 ListNode*ListNextElem(ListNode*p=NULL);//返回循环链表p指针指向节点的直接后继,若不输入参数,则返回头指针 ListNode*CirListRemove(ListNode*p);//在循环链表中删除p指针指向节点的直接后继,且将其地址通过函数值返回 CirList&operator=(CirList&List);//重载赋

数据结构实验六 堆栈实验

一,实验题目 实验六堆栈实验 设计算法,把一个十进制整数转化为二进制数输出。 二,问题分析 本程序要求将一个十进制整数转化为二进制数输出。完成此功能所要解决的问题是熟练掌握和运用入栈和出栈操作,实现十进制整数转化为二进制数。 (1)数据的输入形式和输入值得范围:输入的是一个十进制整数,且其为正整数。 (2)结果的输出形式:输出的是一个二进制整数 (3)测试数据:1)9 2)4500 三,概要设计 1.为了实现上述程序功能,需要: 构造一个空的顺序栈s 将十进制整数除以2的余数入栈 将余数按顺序出栈 2.本程序包含7个函数: 1)主函数main(); 2)顺序栈判栈空函数stackempty(seqstack *s) 3)顺序栈置空栈函数seqstack *initstack(seqstack *s) 4)顺序栈入栈函数push(seqstack *s,int x) 5)顺序栈出栈函数pop(seqstack *s) 6)顺序栈取栈顶元素函数gettop(seqstack *s) 7)将十进制数转换为二进制数函数setnum(int num) 各函数间关系如下:

四,详细设计 1,顺序表的结构类型定义: typedef struct{ int data[maxlen]; int top; }seqstack; 2,顺序栈入栈函数的伪代码: void push(seqstack *s,int x){ if(s->top<=maxlen-1&&s->top>=-1){ s->top++; s->data[s->top]=x;} else printf("error");} 3,顺序栈出栈函数的伪代码: void pop(seqstack *s){ if(s->top>=0) s->top--; else printf("error"); } 4,将十进制数转换为二进制数函数伪代码: void setnum(int num){ seqstack s; initstack(&s); while(num){ int k=num%2; push(&s,k); num=num/2;} while(!stackempty(&s)){ int x=gettop(&s); printf("%d",x); pop(&s); } } 五,源代码 #include "stdio.h" #define maxlen 100 typedef struct{ //定义顺序栈的结构类型 int data[maxlen]; int top; }seqstack; int stackempty(seqstack *s){ //顺序栈判栈空算法if(s->top>=0) return 0; else return 1; } seqstack *initstack(seqstack *s){ //顺序栈置空栈算法s->top=-1; return s; }

数据结构实验报告及心得体会

2011~2012第一学期数据结构实验报告 班级:信管一班 学号:201051018 姓名:史孟晨

实验报告题目及要求 一、实验题目 设某班级有M(6)名学生,本学期共开设N(3)门课程,要求实现并修改如下程序(算法)。 1. 输入学生的学号、姓名和 N 门课程的成绩(输入提示和输出显示使用汉字系统), 输出实验结果。(15分) 2. 计算每个学生本学期 N 门课程的总分,输出总分和N门课程成绩排在前 3 名学 生的学号、姓名和成绩。 3. 按学生总分和 N 门课程成绩关键字升序排列名次,总分相同者同名次。 二、实验要求 1.修改算法。将奇偶排序算法升序改为降序。(15分) 2.用选择排序、冒泡排序、插入排序分别替换奇偶排序算法,并将升序算法修改为降序算法;。(45分)) 3.编译、链接以上算法,按要求写出实验报告(25)。 4. 修改后算法的所有语句必须加下划线,没做修改语句保持按原样不动。 5.用A4纸打印输出实验报告。 三、实验报告说明 实验数据可自定义,每种排序算法数据要求均不重复。 (1) 实验题目:《N门课程学生成绩名次排序算法实现》; (2) 实验目的:掌握各种排序算法的基本思想、实验方法和验证算法的准确性; (3) 实验要求:对算法进行上机编译、链接、运行; (4) 实验环境(Windows XP-sp3,Visual c++); (5) 实验算法(给出四种排序算法修改后的全部清单); (6) 实验结果(四种排序算法模拟运行后的实验结果); (7) 实验体会(文字说明本实验成功或不足之处)。

三、实验源程序(算法) Score.c #include "stdio.h" #include "string.h" #define M 6 #define N 3 struct student { char name[10]; int number; int score[N+1]; /*score[N]为总分,score[0]-score[2]为学科成绩*/ }stu[M]; void changesort(struct student a[],int n,int j) {int flag=1,i; struct student temp; while(flag) { flag=0; for(i=1;ia[i+1].score[j]) { temp=a[i]; a[i]=a[i+1]; a[i+1]=temp; flag=1; } for(i=0;ia[i+1].score[j]) { temp=a[i]; a[i]=a[i+1]; a[i+1]=temp; flag=1;

数据结构栈和队列实验报告.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;

数据结构实验报告栈进制转换

数据结构试验报告栈的应用——进制转换程序

if(s->top - s->base >= STACK_INIT_SIZE) { s->base=(int *)realloc(s->base , (s->stacksize + STACKINCREMENT) * sizeof(int) ); if(!s->base) { exit(OVERFLOW); } s->top=s->base + STACKINCREMENT; } * s->top ++ = *e; return OK; } 3.出栈程序 int Pop(Stack *s , int *e) { if(s->top == s->base) { return ERROR; } *e = * -- s->top; return OK;

} 4.主函数与进制转化 void main() { int N; int a; int e; Stack s; InitStack(&s); Pop(&s , &e); Push(&s ,&e); InitStack(&s); printf("请输入十进制数:"); scanf("%d",&N); printf("要将N转化为几进制"); scanf("%d",&a); while(N) { e=N%a; Push( &s , &e ); N = N / a ; }

int *base; int *top; int stacksize; }Stack; int InitStack(Stack *s) { s->base=(int *)malloc(STACK_INIT_SIZE * sizeof(int)); if(!s->base) { exit(OVERFLOW); } s->top=s->base; s->stacksize=STACK_INIT_SIZE; return OK; } int Push(Stack *s , int *e) { if(s->top - s->base >= STACK_INIT_SIZE) { s->base=(int *)realloc(s->base , (s->stacksize + STACKINCREMENT) * sizeof(int) );

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

《数据结构》课程实验报告 实验名称栈和队列实验序号实验日期 姓名院系班级学号 专业指导教师成绩 教师评语 一、实验目的和要求 (1)理解栈和队列的特征以及它们之间的差异,知道在何时使用那种数据结构。 (2)重点掌握在顺序栈上和链栈上实现栈的基本运算算法,注意栈满和栈空的条件。 (3)重点掌握在顺序队上和链队上实现队列的基本运算算法,注意循环队队列满和队空的条件。 (4)灵活运用栈和队列这两种数据结构解决一些综合应用问题。 二、实验项目摘要 编写一个程序algo3-1.cpp,实现顺序栈的各种基本运算,并在此基础上设计一个主程序并完成如下功能:(1)初始化栈s; (2)判断栈s是否非空; (3)依次进栈元素a,b,c,d,e; (4)判断栈s是否非空; (5)输出栈长度; (6)输出从栈顶到栈底元素; (7)输出出栈序列; (8)判断栈s是否非空; (9)释放栈。 编写一个程序algo3-3.cpp,实现顺序环形队列的各种基本运算,并在此基础上设计一个主程序并完成如下功能: (1)初始化队列q; (2)判断队列q是否非空; (3)依次进队列a,b,c; (4)出队一个元素,输出该元素; (5)输出队列q的元素个数; (6)依次进队列元素d,e,f; (7)输出队列q的元素个数; (8)输出出队序列; (9)释放队列。

三、实验预习内容 栈的顺序存储结构及其基本运算实现(初始化栈,销毁栈,求栈的长度,判断栈是否为空,进栈,取栈顶元素,显示栈中元素) 队列的顺序存储结构及其基本运算实现(初始化队列,销毁队列,判断队列是否为空,入队列,出队列) 三、实验结果与分析 3-1 #define maxsize 100 #include #include using namespace std; typedef char ElemType; typedef struct { ElemType data[maxsize]; int top; } SqStack; void InitStack(SqStack * &s) { s=(SqStack *)malloc(sizeof(SqStack)); s->top=-1; } int StackEmpty(SqStack *s) { return(s->top==-1); } int Push(SqStack *&s,ElemType e) { if(s->top==maxsize-1) return 0; s->top++; s->data[s->top]=e; return 1; } int Pop(SqStack *&s,ElemType &e) { if(s->top==-1) return 0; e=s->data[s->top];

数据结构实验报告图实验

图实验 一,邻接矩阵的实现 1.实验目的 (1)掌握图的逻辑结构 (2)掌握图的邻接矩阵的存储结构 (3)验证图的邻接矩阵存储及其遍历操作的实现 2.实验内容 (1)建立无向图的邻接矩阵存储 (2)进行深度优先遍历 (3)进行广度优先遍历 3.设计与编码 #ifndef MGraph_H #define MGraph_H const int MaxSize = 10; template class MGraph { public: MGraph(DataType a[], int n, int e); ~MGraph(){ } void DFSTraverse(int v); void BFSTraverse(int v); private: DataType vertex[MaxSize]; int arc[MaxSize][MaxSize]; int vertexNum, arcNum; }; #endif #include using namespace std; #include "" extern int visited[MaxSize]; template MGraph::MGraph(DataType a[], int n, int e) { int i, j, k; vertexNum = n, arcNum = e; for(i = 0; i < vertexNum; i++) vertex[i] = a[i]; for(i = 0;i < vertexNum; i++) for(j = 0; j < vertexNum; j++) arc[i][j] = 0;

数据结构实验报告 - 答案汇总

数据结构(C语言版) 实验报告

专业班级学号姓名 实验1 实验题目:单链表的插入和删除 实验目的: 了解和掌握线性表的逻辑结构和链式存储结构,掌握单链表的基本算法及相关的时间性能分析。 实验要求: 建立一个数据域定义为字符串的单链表,在链表中不允许有重复的字符串;根据输入的字符串,先找到相应的结点,后删除之。 实验主要步骤: 1、分析、理解给出的示例程序。 2、调试程序,并设计输入数据(如:bat,cat,eat,fat,hat,jat,lat,mat,#),测试程序 的如下功能:不允许重复字符串的插入;根据输入的字符串,找到相应的结点并删除。 3、修改程序: (1)增加插入结点的功能。 (2)将建立链表的方法改为头插入法。 程序代码: #include"stdio.h" #include"string.h" #include"stdlib.h" #include"ctype.h" typedef struct node //定义结点 { char data[10]; //结点的数据域为字符串 struct node *next; //结点的指针域 }ListNode; typedef ListNode * LinkList; // 自定义LinkList单链表类型 LinkList CreatListR1(); //函数,用尾插入法建立带头结点的单链表 LinkList CreatList(void); //函数,用头插入法建立带头结点的单链表 ListNode *LocateNode(); //函数,按值查找结点 void DeleteList(); //函数,删除指定值的结点 void printlist(); //函数,打印链表中的所有值 void DeleteAll(); //函数,删除所有结点,释放内存

数据结构实验报告

数据结构实验报告 想必学计算机专业的同学都知道数据结构是一门比较重要 的课程,那么,下面是小编给大家整理收集的数据结构实验报告,供大家阅读参考。 数据结构实验报告1 一、实验目的及要求 1)掌握栈和队列这两种特殊的线性表,熟悉它们的特性,在实际问题背景下灵活运用它们。 本实验训练的要点是“栈”和“队列”的观点; 二、实验内容 1) 利用栈,实现数制转换。 2) 利用栈,实现任一个表达式中的语法检查(选做)。 3) 编程实现队列在两种存储结构中的基本操作(队列的初始化、判队列空、入队列、出队列); 三、实验流程、操作步骤或核心代码、算法片段

顺序栈: Status InitStack(SqStack S) { S.base=(ElemType*)malloc(STACK_INIT_SIZE*sizeof(ElemType)); if(!S.base) return ERROR; S.top=S.base; S.stacksize=STACK_INIT_SIZE; return OK; } Status DestoryStack(SqStack S) { free(S.base); return OK; } Status ClearStack(SqStack S)

{ S.top=S.base; return OK; } Status StackEmpty(SqStack S) { if(S.base==S.top) return OK; return ERROR; } int StackLength(SqStack S) { return S.top-S.base; } Status GetTop(SqStack S,ElemType e) {

数据结构实验报告(图)

附录A 实验报告 课程:数据结构(c语言)实验名称:图的建立、基本操作以及遍历系别:数字媒体技术实验日期: 12月13号 12月20号 专业班级:媒体161 组别:无 姓名:学号: 实验报告内容 验证性实验 一、预习准备: 实验目的: 1、熟练掌握图的结构特性,熟悉图的各种存储结构的特点及适用范围; 2、熟练掌握几种常见图的遍历方法及遍历算法; 实验环境:Widows操作系统、VC6.0 实验原理: 1.定义: 基本定义和术语 图(Graph)——图G是由两个集合V(G)和E(G)组成的,记为G=(V,E),其中:V(G)是顶点(V ertex)的非空有限集E(G)是边(Edge)的有限集合,边是顶点的无序对(即:无方向的,(v0,v2))或有序对(即:有方向的,)。 邻接矩阵——表示顶点间相联关系的矩阵 设G=(V,E) 是有n 1 个顶点的图,G 的邻接矩阵A 是具有以下性质的n 阶方阵特点: 无向图的邻接矩阵对称,可压缩存储;有n个顶点的无向图需存储空间为n(n+1)/2 有向图邻接矩阵不一定对称;有n个顶点的有向图需存储空间为n2 9

无向图中顶点V i的度TD(V i)是邻接矩阵A中第i行元素之和有向图中, 顶点V i的出度是A中第i行元素之和 顶点V i的入度是A中第i列元素之和 邻接表 实现:为图中每个顶点建立一个单链表,第i个单链表中的结点表示依附于顶点Vi的边(有向图中指以Vi为尾的弧) 特点: 无向图中顶点Vi的度为第i个单链表中的结点数有向图中 顶点Vi的出度为第i个单链表中的结点个数 顶点Vi的入度为整个单链表中邻接点域值是i的结点个数 逆邻接表:有向图中对每个结点建立以Vi为头的弧的单链表。 图的遍历 从图中某个顶点出发访遍图中其余顶点,并且使图中的每个顶点仅被访问一次过程.。遍历图的过程实质上是通过边或弧对每个顶点查找其邻接点的过程,其耗费的时间取决于所采用的存储结构。图的遍历有两条路径:深度优先搜索和广度优先搜索。当用邻接矩阵作图的存储结构时,查找每个顶点的邻接点所需要时间为O(n2),n为图中顶点数;而当以邻接表作图的存储结构时,找邻接点所需时间为O(e),e 为无向图中边的数或有向图中弧的数。 实验内容和要求: 选用任一种图的存储结构,建立如下图所示的带权有向图: 要求:1、建立边的条数为零的图;

数据结构实验—图实验报告

精品文档数据结构 实 验 报 告

目的要求 1.掌握图的存储思想及其存储实现。 2.掌握图的深度、广度优先遍历算法思想及其程序实现。 3.掌握图的常见应用算法的思想及其程序实现。 实验内容 1.键盘输入数据,建立一个有向图的邻接表。 2.输出该邻接表。 3.在有向图的邻接表的基础上计算各顶点的度,并输出。 4.以有向图的邻接表为基础实现输出它的拓扑排序序列。 5.采用邻接表存储实现无向图的深度优先递归遍历。 6.采用邻接表存储实现无向图的广度优先遍历。 7.在主函数中设计一个简单的菜单,分别调试上述算法。 源程序: 主程序的头文件:队列 #include #include #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define OVERFLOW -2 typedef int QElemType; typedef struct QNode{ //队的操作 QElemType data; struct QNode *next; }QNode,*QueuePtr; typedef struct { QueuePtr front; QueuePtr rear; }LinkQueue; void InitQueue(LinkQueue &Q){ //初始化队列 Q.front =Q.rear =(QueuePtr)malloc(sizeof(QNode)); if(!Q.front) exit(OVERFLOW); //存储分配失败 Q.front ->next =NULL; } int EnQueue(LinkQueue &Q,QElemType e) //插入元素e为Q的新的队尾元素{ QueuePtr p; p=(QueuePtr)malloc(sizeof(QNode)); if(!p) exit(OVERFLOW); p->data=e;

相关主题
文本预览
相关文档 最新文档