栈的表示及实现 实验报告.docx
《栈的表示及实现 实验报告.docx》由会员分享,可在线阅读,更多相关《栈的表示及实现 实验报告.docx(11页珍藏版)》请在冰豆网上搜索。
栈的表示及实现实验报告
班级信工082学号200806030202姓名李霄实验组别
实验日期2010-12-20室温报告日期2010-12-20成绩
报告内容:
(目的和要求,原理,步骤,数据,计算,小结等)
实验名称:
实验二栈的表示及实现
实验目的:
1、通过实验进一步理解栈的“先进后出”特性。
2、掌握栈的逻辑结构,以及顺序存储结构和链式存储结构。
3、熟练运用C语言实现栈的基本操作。
4、灵活运用栈解决实际问题。
实验内容:
已知学生数据元素的数据类型如下:
StructStudent{
intID;/*学号*/
charname[10];/*姓名*/
};
1、请设计4个学生数据,学号分别为10,20,30,40,并把这些数据依次入顺序栈,然后出栈并在屏幕上显示出来。
2、入栈两个学生数据,然后出栈一个学生数据,再次入栈两个学生数据,然后出栈3个学生数据,并与1的结果进行比较。
3、如何操作能得到“20,40,30,10”的结果。
4、使用与1同样的学生数据,并把这些数据依次入链栈,然后出栈并在屏幕上显示出来,与1的结果比较看是否一样。
5、请设计一个能够测试栈空和栈满的实验。
实验学时、:
2学时
实验程序
#include"malloc.h"
#include"conio.h"
#include"stdio.h"
#defineSTACKSIZE100
typedefintDataType;
typedefstruct{
DataTypeitems[STACKSIZE];
inttop;
}SqStack;
typedefstructSNode{
DataTypedata;
structSNode*next;
}SNode,*LinkStack;
structstudent
{
intID;
charname[10];
};
structstudentstu[4]={{10,"li"},{20,"song"},{30,"xiao"},{40,"hang"}};
main()
{
sheji1();
printf("\nanrenyijianjinxingsheji2\n");
getchar();
sheji2();
printf("\nanrenyijianjinxingsheji3\n");
getchar();
sheji2();
printf("\nanrenyijianjinxingsheji4\n");
getchar();
sheji4();
printf("\nanrenyijianjinxingsheji5\n");
getchar();
sheji5();
}
sheji1()
{
SqStacksta;
inti,e;
intlength=4;
InitStack(&sta);
for(i=0;iPush(&sta,stu[i].ID);
printf("chuzhanshunxu1wei:
\n");
while(!
StackEmpty(sta))
{Pop(&sta,&e);
printf("%d\t",e);
}
}
sheji2()
{inti,e;
SqStacksta;
InitStack(&sta);
for(i=0;i<2;i++)
Push(&sta,stu[i].ID);
printf("chuzhanshunxu2wei:
\n");
Pop(&sta,&e);
printf("%d\t",e);
for(i=2;i<4;i++)
Push(&sta,stu[i].ID);
while(!
StackEmpty(sta))
{
Pop(&sta,&e);
printf("%d\t",e);
}
}
sheji4()
{
inti,e;
int*top;
InitStack1(&top);
for(i=0;i<4;i++)
Push1(top,stu[i].ID);
if(!
StackEmpty1(top))
{
Pop1(top,&e);
printf("%d\t",e);
}
}
sheji5()
{
inti=1,e;
SqStacksta;
int*top;
InitStack(&sta);
if(StackEmpty(sta))printf("zhanweikong");
if(!
StackEmpty(sta))
{Pop1(top,&e);
i++;
}
if(i==STACKSIZE)printf("zhanweiman");
}
intInitStack(SqStack*sta)
{
sta->top=-1;
return1;
}
intStackEmpty(SqStacksta)
{
if(sta.top==-1)
return1;
else
return0;
}
intPush(SqStack*sta,inte)
{
if(sta->top>=STACKSIZE-1)
{
printf("errors\n");
return0;
}
sta->top++;
sta->items[sta->top]=e;
return1;
}
intPop(SqStack*sta,int*e)
{
if(sta->top<=-1)
{
printf("cuowu\n");
return0;
}
*e=sta->items[sta->top];
sta->top--;
return1;
}
intInitStack1(LinkStack*top)
{
*top=(LinkStack)malloc(sizeof(SNode));
if(*top==NULL){printf("cuowu");return0;}
(*top)->next=NULL;
return1;
}
intPush1(LinkStacktop,DataTypee)
{
SNode*p;
p=(SNode*)malloc(sizeof(SNode));
if(!
p){printf("cuowu");return0;}
p->data=e;
p->next=top->next;
top->next=p;
return1;
}
intPop1(LinkStacktop,DataType*e)
{SNode*p;
if(!
top->next)
{printf("cuowu");
return0;
}
p=top->next;
top->next=p->next;
*e=p->data;
free(p);
return1;
}
intStackEmpty1(LinkStacktop)
{
if(top->next==NULL)
return1;
elsereturn0;
}
实验步骤
1、WIN-TC开发环境安装与配置
1)首先在网上下载WIN-TC的版本;
2)下载完成后进行安装,安装路径默认就可以了,一路next就ok了;
3)打开WIN-TC会出现如下界面;
2、在WIN-TC中输程序,源代码见算法流程。
3、在运行中点编译连接。
4、运行后显示编译成功即没有错误,如图:
5、点确定后再在运行中点编译连接并运行,并出现如下窗口:
6、点击确定后出现如下窗口:
7、按回车后显示:
8、按回车显示如图:
9、按回车显示如图:
10、按回车显示如图:
实验结果:
通过实验步骤中的截图可以看出本次实验所编译的程序能够实验实验内容中的要求。
心得体会:
通过本次实验,使我区分了顺序栈和链栈,同时对顺序栈的定义、入栈、出栈等程序的编译及其调用有所了解,并且对链栈的定义、入栈、出栈等程序的编译及其调用有所掌握,并对其结构通过运行的过程中有所掌握。