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

上传人:b****6 文档编号:5829517 上传时间:2023-01-01 格式:DOCX 页数:11 大小:19KB
下载 相关 举报
数据结构堆栈实验报告doc.docx_第1页
第1页 / 共11页
数据结构堆栈实验报告doc.docx_第2页
第2页 / 共11页
数据结构堆栈实验报告doc.docx_第3页
第3页 / 共11页
数据结构堆栈实验报告doc.docx_第4页
第4页 / 共11页
数据结构堆栈实验报告doc.docx_第5页
第5页 / 共11页
点击查看更多>>
下载资源
资源描述

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

《数据结构堆栈实验报告doc.docx》由会员分享,可在线阅读,更多相关《数据结构堆栈实验报告doc.docx(11页珍藏版)》请在冰豆网上搜索。

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

数据结构堆栈实验报告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)定义数据元素的数据类型为如下形式的结构体,

  Typedefstruct

  {

  c(本文来自:

小草范文网:

数据结构堆栈实验报告)hartaskName[10];

  inttaskNo;

  }DataType;

  首先设计一个包含5个数据元素的测试数据,然后设计一个主函数对链式堆栈进行测试,测试方法为:

依次吧5个数据元素入栈,然后出栈并在屏幕上显示出栈的数据元素。

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

现要求:

  

(1)设计一个使用对头指针和计数器的顺序循环队列抽象数据类型,其中操作包括:

初始化,入队列,出队列,取对头元素和判断队列是否为空;

  

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

  实验结果:

  3-18

  typedefstructsnode

  {

  DataTypedata;

  structsnode*next;

  }LSNode;

  /*初始化操作:

*/

  voidStackInitiate(LSNode**head)

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

  {

  if((*head=(LSNode*)malloc(sizeof(LSNode)))==NULL)exit

(1);(*head)->next=NULL;

  }

  /*判非空操作:

*/

  intStackNotEmpty(LSNode*head)

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

  {

  if(head->next==NULL)return0;

  elsereturn1;

  }

  /*入栈操作:

*/

  intStackPush(LSNode*head,DataTypex)

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

  LSNode*p;

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

  {

  printf("内存空间不足无法插入!

\n");

  return0;

  }

  p->data=x;

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

  }

  /*出栈操作:

*/

  intStackPop(LSNode*head,DataType*d)

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

  {

  LSNode*p=head->next;

  if(p==NULL)

  {

  printf("堆栈已空出错!

");

  return0;

  }

  head->next=p->next;/*删除原栈顶结点*/

  *d=p->data;/*原栈顶结点元素赋予d*/free(p);/*释放原栈顶结点内存空间*/return1;

  }

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

*/

  intStackTop(LSNode*head,DataType*d)

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

  {

  LSNode*p=head->next;

  if(p==NULL)

  {

  printf("堆栈已空出错!

");

  return0;

  }

  *d=p->data;

  return1;

  }

  /*撤销*/

  voidDestroy(LSNode*head)

  {

  LSNode*p,*p1;

  p=head;

  while(p!

=NULL)

  {

  p1=p;

  p=p->next;

  free(p1);

  }

  }

(2)主函数程序:

  #include

  #include

  typedefintDataType;

  #include"LinStack.h"

  voidmain(void)

  {LSNode*myStack;

  inti,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("Theelementoflocaltopis:

%d\n",x);printf("Thesequenceofoutingelementsis:

\n");while(StackNotEmpty(myStack))

  {

  StackPop(myStack,&x);

  printf("%d",x);

  }

  printf("\n");

  Destroy(myStack);

  printf("Thisprogramismadeby\n");}

  运行结果为:

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

  #include

  #include

  #include

  typedefstruct{

  chartaskName[10];

  inttaskNo;

  }DataType;

  #include"LinStack.h"

  voidmain(){

  LSNode*myStack;

  FILE*fp;

  DataTypetask,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("Thisprogramismadeby\n");

  }运行结果为:

  3-19

  

(1)

  typedefstruct

  {

  DataTypequeue[MaxQueueSize];

  intfront;/*队头指针*/

  intcount;/*计数器*/

  }SeqCQueue;

  /*初始化操作:

QueueInitiate(SeqCQueue*Q)*/

  voidQueueInitiate(SeqCQueue*Q)

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

  {

  Q->front=0;/*定义初始队头指针下标*/Q->count=0;/*定义初始计数器值*/

  }

  /*判非空否操作:

QueueNotEmpty(SeqCQueueQ)*/intQueueNotEmpty(SeqCQueueQ)

篇二:

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

  一、实验目的和要求

  

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

  

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

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

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

  二、实验环境和方法

  实验方法:

  

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

  

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

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

  实验环境:

WindowsxpVisualC++6.0

  三、实验内容及过程描述

  实验步骤:

  ①进入VisualC++6.0集成环境。

  ②输入自己编好的程序。

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

  错,及时改正。

  ④进行编译和连接。

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

  根据提示找到出错位置和原因,加以改正。

再进行编译,如此反复直到不出错为止。

⑤运行程序并分析运行结果是否合理。

在运行是要注意当输入不同的数据时所得结果

  是否正确,应运行多次,分别检查在不同情况下结果是否正确。

  实验内容:

编译以下题目的程序并调试运行。

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

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

  程序并完成如下功能:

  

(1)初始化栈s;

  

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

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

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

  (5)输出出栈序列;

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

  (7)释放栈。

图3.1Proj3_1工程组成

  本工程Proj3_1的组成结构如图3.1所示。

本工程的模块结构如图3.2所示。

图中方框表示函数,方框中指出函数名,箭头方向表示函数间的调用关系。

  图3.2Proj3_1工程的程序结构图

  其中包含如下函数:

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

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

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

  Push(SqStack*&s,ElemTypee)//进栈

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

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

  对应的程序如下:

  //文件名:

algo3-1.cpp

  #include

  #include

  #defineMaxSize100

  typedefcharElemType;

  typedefstruct

  {

  ElemTypedata[MaxSize];

  inttop;//栈顶指针

  }SqStack;

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

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

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

  }

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

  {

  free(s);

  }

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

  {

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

  }

  boolPush(SqStack*&s,ElemTypee)//进栈

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

  returnfalse;

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

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

  returntrue;

  }

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

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

  returnfalse;

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

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

  returntrue;

  }

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

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

  returnfalse;

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

  returntrue;

  }

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

exp3-1.cpp

  #include

  #include

  #defineMaxSize100

  typedefcharElemType;

  typedefstruct

  {

  ElemTypedata[MaxSize];

  inttop;//栈顶指针

  }SqStack;

  externvoidInitStack(SqStack*&s);

  externvoidDestroyStack(SqStack*&s);

  externboolStackEmpty(SqStack*s);

  externboolPush(SqStack*&s,ElemTypee);

  externboolPop(SqStack*&s,ElemType&e);

  externboolGetTop(SqStack*s,ElemType&e);

  voidmain()

  {

  ElemTypee;

  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.3Proj3_2工程组成

  (9)释放队列。

  本工程Proj3_2的组成结构如图3.3所示。

本工程的模块结构如图3.4所示。

图中方框表示函数,方框中指出函数名,箭头方向表示函数间的调用关系。

  图3.4Proj3_2工程的程序结构图

  其中包含如下函数:

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

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

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

  Push(LiStack*&s,ElemTypee)//进栈

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

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

  对应的程序如下:

  //文件名:

algo3-2.cpp

  #include

  #include

  typedefcharElemType;

  typedefstructlinknode

  {

  ElemTypedata;//数据域

篇三:

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

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

  学院:

数学与计算机学院班级:

计算机科学与技术姓名:

杨理源

  学号:

XX

  实验三栈与队列

  一、实验目的:

  

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

  

(2)能够在两种存储结构上实现栈的基本运算,特别注意栈满和栈空的判断条件及描述方法;

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

  (4)掌握栈的应用;

  二、实验要求:

  

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

  

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

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

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

  四、实验内容:

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

#include

  #include

  #include

  #definestack_init_size100

  #definestackincrement10

  typedefstructsqstack{

  int*base;

  int*top;

  intstacksize;

  }sqstack;

  intStackInit(sqstack*s)

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

  if(!

s->base)

  return0;

  s->top=s->base;

  s->stacksize=stack_init_size;

  return1;

  }

  intPush(sqstack*s,inte)

  {

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

  {

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

s->base)

  return0;

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

  s->stacksize+=stackincrement;

  }

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

  returne;

  }

  intPop(sqstack*s,inte)

  {

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

  return0;

  e=*--s->top;

  returne;

  }

  intstackempty(sqstack*s)

  {

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

  {

  return1;

  }

  else

  {

  return0;

  }

  }

  intconversion(sqstack*s)

  {

  intn,e=0,flag=0;

  printf("

  输入要转化的十进制数:

  \n");

  scanf("%d",&n);

  printf("要转化为多少进制:

2进制、8进制、16进制填数字!

\n");scanf("%d",&flag);

  printf("将十进制数%d转化为%d进制是:

\n",n,flag);

  while(n)

  {

  Push(s,n%flag);

  n=n/flag;}

  while(!

stackempty(s))

  {

  e=Pop(s,e);

  switch(e)

  {

  case10:

printf("A");

  break;

  case11:

printf("B");

  break;

  case12:

printf("C");

  break;

  case13:

printf("D");

  break;

  case14:

printf("E");

  break;

  case15:

printf("F");

  break;

  default:

printf("%d",e);}

  }

  printf("\n");

  return0;}

  intmain()

  {

  sqstacks;

  StackInit(&s);

  conversion(&s);

  return0;

  }

  2、回文数判断

  #include

  #include

  #defineMAX50

  #defineFALSE0

  #defineTURE1

  //定义栈

  typedefstruct

  {

  charelem[MAX];

  inttop;

  }SeqStack;

  //定义循环队列

  typedefstruct

  {

  charelement[MAX];

  intfront;

  intrear;

  }SeqQuene;

  //初始化栈

  voidInitStack(SeqStack*S){

  S->top=-1;//构造一个

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 经管营销

copyright@ 2008-2022 冰豆网网站版权所有

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