实验报告三.docx
- 文档编号:8396273
- 上传时间:2023-01-31
- 格式:DOCX
- 页数:52
- 大小:207.40KB
实验报告三.docx
《实验报告三.docx》由会员分享,可在线阅读,更多相关《实验报告三.docx(52页珍藏版)》请在冰豆网上搜索。
实验报告三
实验编号:
3四川师大《数据结构》实验报告2015年11月6日
计算机科学学院2014级4班实验名称:
实验三:
栈和队列及其应用
姓名:
张俊学号:
2014110454指导老师:
_廖雪花_实验成绩:
_____
实验三栈和队列及其应用
一.实验目的及要求
(1)掌握栈和队列这两种特殊的线性表,熟悉它们的特性,在实际问题背景下灵活运用它们;
(2)本实验训练的要点是“栈”的观点及其典型用法;
(3)掌握问题求解的状态表示及其递归算法,以及由递归程序到非递归程序的转化方法。
二.实验内容
(1)编程实现栈在两种存储结构中的基本操作(栈的初始化、判栈空、入栈、出栈等);
(2)应用栈的基本操作,实现数制转换(任意进制);
(3)编程实现队列在两种存储结构中的基本操作(队列的初始化、判队列空、入队列、出队列);
(4)利用栈实现任一个表达式中的语法检查(括号的匹配)。
(5)利用栈实现表达式的求值。
三.实验主要流程、基本操作或核心代码、算法片段(该部分如不够填写,请另加附页)
(1)编程实现栈在两种存储结构中的基本操作(栈的初始化、判栈空、入栈、出栈等);
Ø程序代码部分:
//main.cpp
#include
#include
#include"c.h"
intmain()
{
inta=0;
while
(1)
{
printf("1-----栈的顺序操作\n");
printf("2-----栈的链式操作\n");
printf("3-----退出\n");
printf("请输入1--3的任意数字\n");
scanf("%d",&a);
switch(a)
{
case1:
StackListfunction();
break;
case2:
StackLinkfunction();
break;
case3:
break;
}
if(a==3)
{
break;
}
}
return0;
}
voidStackListfunction()
{
SqStackS;
SElemTypee;
intb;
inti=0;
intnum1=0;
while
(1)
{
printf("1----初始化栈\n");
printf("2----入栈\n");
printf("3----是否为空栈\n");
printf("4----栈的长度\n");
printf("5----栈顶元素\n");
printf("6----出栈\n");
printf("7----置为空栈\n");
printf("8----销毁栈\n");
printf("9----退出\n");
printf("请输入1-9的任意数字\n");
scanf("%d",&b);
switch(b)
{
case1:
if(InitStack(S))
printf("创建空栈成功\n");
else
printf("创建失败,请重新创建\n");
break;
case2:
printf("请输入你要入栈的元素个数为:
\n");
scanf("%d",&num1);
while(num1<=0)
{
printf("输入错误,请重新输入\n");
scanf("%d",&num1);
}
printf("请输入你要入栈的元素值为:
\n");
for(i=0;i { scanf("%d",&e); Push(S,e); } printf("栈类元素为: \n"); showstacklist(S); printf("\n"); break; case3: if(StackEmpty(S)) printf("栈为空\n"); else printf("已有元素入栈\n"); break; case4: printf("栈的元素个数为%d",Stacklength(S)); printf("\n"); break; case5: if(GetTop(S,e)) printf("栈顶元素为%d",e); printf("\n"); break; case6: if(Pop(S,e)) printf("出栈的元素为%d",e); else printf("栈为空栈,不能出栈\n"); printf("\n"); printf("栈类元素为: \n"); showstacklist(S); printf("\n"); break; case7: if(ClearStack(S)) printf("置为空栈成功\n"); else printf("置为空栈不成功\n"); break; case8: if(DestoryStack(S)) printf("销毁栈成功\n"); else printf("销毁栈不成功\n"); break; case9: break; } if(b==9) break; } } voidStackLinkfunction() { intnum2=0; inti=0; StackLinkL; SElemTypee=0; intc; while (1) { printf("1----初始化栈\n"); printf("2----入栈\n"); printf("3----是否为空栈\n"); printf("4----栈的长度\n"); printf("5----栈顶元素\n"); printf("6----出栈\n"); printf("7----置为空栈\n"); printf("8----销毁栈\n"); printf("9----退出\n"); printf("请输入1-9的任意数字\n"); scanf("%d",&c); switch(c) { case1: if(InitStack_Link(L)) printf("初始化栈成功\n"); break; case2: printf("请输入你要入栈的元素个数为: \n"); scanf("%d",&num2); while(num2<=0) { printf("输入错误,请重新输入\n"); scanf("%d",&num2); } printf("请输入你要入栈的元素值为: \n"); for(i=0;i { scanf("%d",&e); Push_Link(L,e); } showstacklink(L); printf("\n"); break; case3: if(Stack_LinkEmpty(L)) printf("栈为空\n"); else printf("已有元素入栈\n"); break; case4: printf("栈的元素个数为%d",Stack_Linklength(L)); printf("\n"); break; case5: if(GetTop_Link(L,e)) printf("栈顶元素为%d",e); printf("\n"); break; case6: if(Pop_Link(L,e)) { printf("出栈的元素为%d",e); showstacklink(L); printf("\n"); } else printf("栈为空栈,不能出栈\n"); break; case7: if(ClearStack_Link(L)) printf("置为空栈成功\n"); break; case8: if(DestoryStack_Link(L)) printf("销毁栈成功\n"); break; case9: break; } if(c==9) break; } } //a.cpp #include"stdio.h" #include"stdlib.h" #include"c.h" //顺序存储 //统一默认top指针指向栈顶的下一个元素 StatusInitStack(SqStack&S)//初始化一个空栈 { S.base=(SElemType*)malloc(SIZE_INIT*sizeof(SElemType)); if(! S.base) returnerror; S.top=S.base; S.stacksize=SIZE_INIT; returnOK; } StatusDestoryStack(SqStack&S)//销毁栈,栈s不再存在 { free(S.base);//因为是连续的空间,所以释放掉栈底指针就行 //S.base=NULL;//这种方式也可以 S.stacksize=0; returnOK; } StatusClearStack(SqStack&S)//把s置为空栈,栈指针存在,只是没有数据 { S.base=S.top; returnOK; } StatusStackEmpty(SqStackS) { if(S.base==S.top) returnOK; else { returnerror; } } intStacklength(SqStackS)//返回栈的长度,即栈的元素个数 { if(! StackEmpty(S)) return(S.top-S.base); else returnerror; } StatusGetTop(SqStackS,SElemType&e)//若栈不空,用e返回栈顶元素,并返回ok;否则返回error { if(StackEmpty(S)) returnerror; else e=*(S.top-1); returnOK; } StatusPop(SqStack&S,SElemType&e)//若栈不空,栈顶元素出栈,用e返回栈顶元素的值,并返回ok;否则返回error { if(StackEmpty(S)) returnerror; e=*--S.top;//删除栈顶元素,栈顶指针修改 returnOK; } StatusPush(SqStack&S,SElemTypee)//插入元素e为新的栈元素,先判断是否空间已满 { if(S.top-S.base>=S.stacksize) { S.base=(SElemType*)realloc(S.base,(SIZE_INIT+SIZE_STEP)*sizeof(SElemType)); if(! S.base) returnerror; S.top=S.base+S.stacksize;// S.stacksize+=SIZE_STEP;// } *S.top++=e; returnOK; } voidshowstacklist(SqStackS) { if(S.base==S.top) printf("栈为空\n"); while(S.base { printf("%d",*S.base); S.base++; } } //链式存储 StatusInitStack_Link(StackLink&L) { L.top=(SqStackPtr)malloc(sizeof(Snode)); if(! L.top) returnerror; L.top=NULL; L.count=0; returnOK; } StatusDestoryStack_Link(StackLink&L)//销毁栈,栈s不再存在 { SqStackPtrq; while(L.top) { q=L.top;//先用q保存要删除的 L.top=L.top->next;//p指向下一个 free(q);//删除 } L.count=0; returnOK; } StatusClearStack_Link(StackLink&L)//把s置为空栈 { L.count=0; returnOK; } StatusStack_LinkEmpty(StackLinkL)//判断栈s是否为空栈,若为空栈返回true,否则返回error { if(! L.count) returnOK; else returnerror; } intStack_Linklength(StackLinkL)//返回栈的长度,即栈的元素个数 { returnL.count; } StatusGetTop_Link(StackLinkL,SElemType&e)//若栈不空,用e返回栈顶元素,并返回ok;否则返回error { if(! Stack_LinkEmpty(L)) e=L.top->data; returnOK; } StatusPop_Link(StackLink&L,SElemType&e)//若栈不空,栈顶元素出栈,用e返回栈顶元素的值,并返回ok;否则返回error { SqStackPtrq; if(! Stack_LinkEmpty(L)) { /*e=L.top->data; q=L.top;//先用q保存要删除的 L.top=L.top->next;//栈顶指针改变 free(q);*///删除栈顶指针 q=L.top->next;//先用q保存要删除的下一个 free(L.top);//删除 L.top=q;//修改指针 L.count--; } returnOK; } StatusPush_Link(StackLink&L,SElemTypee)//插入元素e为新的栈元素 { SqStackPtrs; s=(Snode*)malloc(sizeof(Snode));//s为新增结点指针 s->data=e; s->next=L.top; L.top=s;//修改栈顶指针L.top注意: : 不能用指针p=L.top因为p为局部变量在这块结束之后p消失,top也为空 L.count++;//元素个数++ returnOK; } voidshowstacklink(StackLinkL) { SqStackPtrp; p=L.top; printf("栈内元素从栈顶到栈底为: \n"); while(p) { printf("%d",p->data); p=p->next; } } //c.h #defineOK1 #defineerror0 #defineSIZE_INIT100 #defineSIZE_STEP10 typedefintSElemType; typedefintStatus; typedefstruct{ SElemType*base; SElemType*top; intstacksize; }SqStack; // typedefstructSnode{ SElemTypedata; structSnode*next; }Snode,*SqStackPtr; typedefstructStack_Link{ SqStackPtrtop; intcount; }StackLink; //顺序存储 voidStackListfunction(); StatusInitStack(SqStack&S);//初始化一个空栈 StatusDestoryStack(SqStack&S);//销毁栈,栈s不再存在 StatusClearStack(SqStack&S);//把s置为空栈 StatusStackEmpty(SqStackS);//判断栈s是否为空栈,若为空栈返回true,否则返回error intStacklength(SqStackS);//返回栈的长度,即栈的元素个数 StatusGetTop(SqStackS,SElemType&e);//若栈不空,用e返回栈顶元素,并返回ok;否则返回error StatusPop(SqStack&S,SElemType&e);//若栈不空,栈顶元素出栈,用e返回栈顶元素的值,并返回ok;否则返回error StatusPush(SqStack&S,SElemTypee);//插入元素e为新的栈元素 voidshowstacklist(SqStackS); //链式存储 voidStackLinkfunction(); StatusInitStack_Link(StackLink&L); StatusDestoryStack_Link(StackLink&L);//销毁栈,栈s不再存在 StatusClearStack_Link(StackLink&L);//把s置为空栈 StatusStack_LinkEmpty(StackLinkL);//判断栈s是否为空栈,若为空栈返回true,否则返回error intStack_Linklength(StackLinkL);//返回栈的长度,即栈的元素个数 StatusGetTop_Link(StackLinkL,SElemType&e);//若栈不空,用e返回栈顶元素,并返回ok;否则返回error StatusPop_Link(StackLink&L,SElemType&e);//若栈不空,栈顶元素出栈,用e返回栈顶元素的值,并返回ok;否则返回error StatusPush_Link(StackLink&L,SElemTypee);//插入元素e为新的栈元素 voidshowstacklink(StackLinkL); Ø运行结果: 顺序栈: 链式栈: (2)应用栈的基本操作,实现数制转换(任意进制); Ø程序代码部分: //main.cpp #include"stdio.h" #include"stdlib.h" #include"c.h" voidmain() { intN,num; printf("请输入你要转化的十进制数\n"); scanf("%d",&N); printf("请输入你要转化成的进制数(2/8/16)\n"); scanf("%d",&num); conversion(N,num); system("pause"); } //a,cpp #include"stdio.h" #include"c.h" StatusInitStack(SqStack&S) { //构造一个空的栈S S.base=(SElemType*)malloc(STACK_INIT_SIZE*sizeof(SElemType)); if(! S.base)exit(OVERFLOW);//存储分配失败 S.top=S.base; S.stacksize=STACK_INIT_SIZE; returnOK; }//InitStack StatusStackEmpty(SqStack&S) { //若栈S为空栈,则返回TRUE,否则返回FALSE if(S.top==S.base)returnTRUE; returnFALSE; } StatusGetTop(SqStackS,SElemType&e) { //若栈不空,则用e返回S的栈顶元素,并返回OK,否则返回ERROR if(S.top==S.base)returnERROR; e=*(S.top-1); returnOK; }//InStack StatusPush(SqStack&S,SElemTypee) { //插入元素e为新的栈顶元素 if(S.top-S.base>=S.stacksize) { //栈满增加存储空间 S.base=(SElemType*)realloc(S.base,(S.stacksize+STACKINCREMENT)* sizeof(SElemType)); if(! S.base)exit(OVERFLOW);//存储分配失败 S.top=S.base+S.stacksize; S.stacksize+=STACKINCREMENT; } *S.top++=e; returnOK; } StatusPop(SqStack&S,SElemType&e) { //若栈不空,则删除S的栈顶元素,用e返回起值,并返回OK,否则返回ERROR if(S.top==S.base)returnERROR; e=*--S.top; returnOK; }//Pop voidconversion(intN,intnum) { //对于输入的任意一个非负十进制数,打印输出与其等值的进制数 SqStackS; SElemTypee; InitStack(S); while(N) { Push(S,N%num); N=N/num; } while(! Stack
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验 报告