数据结构堆栈实验报告docWord下载.docx
《数据结构堆栈实验报告docWord下载.docx》由会员分享,可在线阅读,更多相关《数据结构堆栈实验报告docWord下载.docx(11页珍藏版)》请在冰豆网上搜索。
/*初始化操作:
*/
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->
if(p==NULL)
堆栈已空出错!
"
head->
next=p->
/*删除原栈顶结点*/
*d=p->
data;
/*原栈顶结点元素赋予d*/free(p);
/*释放原栈顶结点内存空间*/return1;
/*取栈顶数据元素操作:
intStackTop(LSNode*head,DataType*d)
/*取栈顶元素并把栈顶元素由参数d带回*/
return1;
/*撤销*/
voidDestroy(LSNode*head)
LSNode*p,*p1;
p=head;
while(p!
=NULL)
p1=p;
p=p->
free(p1);
}
(2)主函数程序:
#include
typedefintDataType;
#include"
LinStack.h"
voidmain(void)
{LSNode*myStack;
inti,x;
StackInitiate(&
myStack);
for(i=0;
i {if(StackPush(myStack,i+1)==0)
error!
\n"
return;
if(StackTop(myStack,&
x)==0)
else
Theelementoflocaltopis:
%d\n"
x);
printf("
Thesequenceofoutingelementsis:
while(StackNotEmpty(myStack))
StackPop(myStack,&
x);
%d"
x);
}
Destroy(myStack);
Thisprogramismadeby\n"
}
运行结果为:
(3)设计结构体和测试函数如下:
typedefstruct{
chartaskName[10];
#include"
voidmain(){
LSNode*myStack;
FILE*fp;
DataTypetask,x;
if((fp=fopen("
task.txt"
"
r"
))==NULL){
不能打开文件task.txt!
exit(0);
while(!
feof(fp)){
fscanf(fp,"
%s%d"
&
task.taskName,&
task.taskNo);
StackPush(myStack,task);
fclose(fp);
while(StackNotEmpty(myStack)){
StackPop(myStack,&
%s%d\n"
x.taskName,x.taskNo);
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
#defineMaxSize100
typedefcharElemType;
ElemTypedata[MaxSize];
inttop;
//栈顶指针
}SqStack;
voidInitStack(SqStack*&
{s=(SqStack*)malloc(sizeof(SqStack));
s->
top=-1;
//栈顶指针置为-1
voidDestroyStack(SqStack*&
free(s);
boolStackEmpty(SqStack*s)//判断栈空
return(s->
top==-1);
boolPush(SqStack*&
{if(s->
top==MaxSize-1)//栈满的情况,即栈上溢出
returnfalse;
top++;
//栈顶指针增1
data[s->
top]=e;
//元素e放在栈顶指针处
returntrue;
boolPop(SqStack*&
top==-1)//栈为空的情况,即栈下溢出
e=s->
top];
//取栈顶指针元素的元素
top--;
//栈顶指针减1
boolGetTop(SqStack*s,ElemType&
设计exp3-1.cpp程序如下//文件名:
exp3-1.cpp
ElemTypedata[MaxSize];
externvoidInitStack(SqStack*&
s);
externvoidDestroyStack(SqStack*&
externboolStackEmpty(SqStack*s);
externboolPush(SqStack*&
s,ElemTypee);
externboolPop(SqStack*&
e);
externboolGetTop(SqStack*s,ElemType&
voidmain()
ElemTypee;
SqStack*s;
栈s的基本运算如下:
(1)初始化栈s\n"
InitStack(s);
(2)栈为%s\n"
(StackEmpty(s)?
空"
:
非空"
));
(3)依次进栈元素a,b,c,d,e\n"
Push(s,'
a'
b'
c'
d'
e'
(4)栈为%s\n"
(5)出栈序列:
while(!
StackEmpty(s))
Pop(s,e);
%c"
e);
(6)栈为%s\n"
(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*&
Pop(LiStack*&
GetTop(LiStack*s,ElemType&
algo3-2.cpp
typedefstructlinknode
ElemTypedata;
//数据域
篇三:
数据结构栈与队列的实验报告
数据结构栈与队列实验报告
学院:
数学与计算机学院班级:
计算机科学与技术姓名:
杨理源
学号:
XX
实验三栈与队列
一、实验目的:
(1)熟练掌握栈和队列的结构以及这两种数据结构的特点、栈与队列的基本操作。
(2)能够在两种存储结构上实现栈的基本运算,特别注意栈满和栈空的判断条件及描述方法;
(3)熟练掌握链队列和循环队列的基本运算,并特别注意队列满和队列空的判断条件和描述方法;
(4)掌握栈的应用;
二、实验要求:
(1)给出程序设计的基本思想、原理和算法描述。
(2)对源程序给出注释。
(3)记录程序的运行结果,并结合程序进行分析。
三、程序设计的基本思想、原理和算法描述:
四、实验内容:
1、利用栈的基本操作将一个十进制的正整数转换成R进制数据,并将其转换结果输出。
#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)
top=s->
base;
stacksize=stack_init_size;
intPush(sqstack*s,inte)
if(s->
top-s->
base>
=s->
stacksize)
base=(int*)realloc(s->
base,(s->
stacksize+stackincrement)*sizeof(int));
if(!
base+s->
stacksize;
stacksize+=stackincrement;
*(s->
top++)=e;
returne;
intPop(sqstack*s,inte)
top==s->
e=*--s->
top;
intstackempty(sqstack*s)
intconversion(sqstack*s)
{
intn,e=0,flag=0;
输入要转化的十进制数:
\n"
scanf("
%d"
n);
printf("
要转化为多少进制:
2进制、8进制、16进制填数字!
scanf("
flag);
将十进制数%d转化为%d进制是:
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:
B"
case12:
C"
case13:
D"
case14:
E"
case15:
F"
default:
}
intmain()
sqstacks;
StackInit(&
conversion(&
2、回文数判断
#defineMAX50
#defineFALSE0
#defineTURE1
//定义栈
charelem[MAX];
}SeqStack;
//定义循环队列
charelement[MAX];
intrear;
}SeqQuene;
//初始化栈
voidInitStack(SeqStack*S){
S->
top=-1;
//构造一个