大数据结构实验报告材料栈和队列文档格式.docx
《大数据结构实验报告材料栈和队列文档格式.docx》由会员分享,可在线阅读,更多相关《大数据结构实验报告材料栈和队列文档格式.docx(18页珍藏版)》请在冰豆网上搜索。
/*定义元素的类型*/
/*
(1)---补充栈的顺序存储分配表示,采用定长和可变长度存储均可*/
typedefstruct
{
ElemType*base;
ElemType*top;
intstacksize;
}SqStack;
intInitStack(SqStack*S);
/*构造空栈*/
intPush(SqStack*S,ElemTypee);
/*入栈*/
intPop(SqStack*S,ElemType*e);
/*出栈*/
intPopSq(SqStack*S);
intGetTop(SqStack*S,ElemType*e);
/*获取栈顶元素*/
intClearStack(SqStack*S);
/*清空栈*/
intStackEmpty(SqStack*S);
/*判断栈是否为空*/
intStackLength(SqStack*S);
/*求栈的长度*/
voidconversion();
/*十进制转换为二进制*/
voidCorrect();
/*判断表达式括号是否匹配*/
/*
(2)---初始化栈函数*/
intInitStack(SqStack*S)
S->
base=(ElemType*)malloc(STACK_INT_SIZE*sizeof(ElemType));
if(!
S->
base)
{
returnERROR;
}
top=S->
base;
stacksize=STACK_INT_SIZE;
returnOK;
}/*InitStack*/
/*(3)---入栈函数*/
intPush(SqStack*S,ElemTypee)
if(S->
top-S->
base>
=S->
stacksize)
base=(ElemType*)realloc(S->
base,(S->
stacksize+STACKINCREMENT)*sizeof(ElemType));
base+S->
stacksize;
stacksize+=STACKINCREMENT;
*S->
top++=e;
}/*Push*/
/*(4)---出栈函数*/
intPop(SqStack*S,ElemType*e)
top==S->
--S->
top;
*e=*S->
}/*Pop*/
intPopSq(SqStack*S)
}
/*(5)---返回栈顶元素函数*/
intGetTop(SqStack*S,ElemType*e)
*e=*(S->
top-1);
}/*GetTop*/
/*(6)---清空栈函数*/
intClearStack(SqStack*S)
if(InitStack(S))
printf("
InitSuccess!
"
);
else
InitFail!
}/*ClearStack*/
/*(8)---判断栈是否为空*/
intStackEmpty(SqStack*S)
base==S->
top)
}/*StackEmpty*/
/*(9)---返回栈的长度函数*/
intStackLength(SqStack*S)
returnS->
}/*StackLength*/
/*(10)---十进制整数转换为二进制并输出函数*/
voidConversion()
inte;
SqStacksq;
InitStack(&
sq);
intcount;
inputcount:
scanf("
%d"
&
count);
while(count!
=0)
Push(&
sq,count%2);
count=count/2;
while(Pop(&
sq,&
e))
%d"
e);
}/*Conversion*/
/*(11)---判断表达式括弧是否匹配(假设只有一种小括弧)函数*/
voidCorrect()
SqStacksqs;
sqs);
chara[100],c;
inti=0;
input:
while((c=getchar())!
='
\n'
)
a[i++]=c;
for(i=0;
i<
strlen(a);
i++)
if(a[i]=='
('
sqs,a[i]);
)'
PopSq(&
if(StackEmpty(&
sqs))
OK!
error!
}/*Correct*/
/*定义菜单字符串数组*/
intmenu_select()
char*menu[]={"
\n***************MENU******************\n"
"
1.InitSatck\n"
/*初始化顺序栈*/
2.PushElement\n"
/*入栈*/
3.GetTopElement\n"
/*获得栈顶元素*/
4.ReturnStackLength\n"
/*返回栈的长度*/
5.StackIsEmpty\n"
/*判断是否栈空*/
6.PopElement\n"
/*出栈*/
7.ClearStack\n"
/*清空栈*/
8.Conversion\n"
/*利用栈进行数制转换*/
9.Correct\n"
/*利用栈进行括号匹配*/
0.Quit\n"
/*退出*/
};
chars[3];
/*以字符形式保存选择号*/
intc,i;
/*定义整形变量*/
for(i=0;
i<
11;
i++)/*输出主菜单数组*/
%s"
menu[i]);
do
\nEnteryouchoice(0~9):
/*在菜单窗口外显示提示信息*/
s);
/*输入选择项*/
c=atoi(s);
/*将输入的字符串转化为整形数*/
while(c<
0||c>
9);
/*选择项不在0~9之间重输*/
returnc;
/*返回选择项,主程序根据该数调用相应的函数*/
intmain()
SqStackss;
ss);
for(;
;
switch(menu_select())
case1:
\n1-InitSatck:
\n"
if(InitStack(&
ss))
InitOK!
InitERROR!
break;
case2:
\n2-PushElement:
inputdata(Terminatedbyinputingacharacter):
while(scanf("
e)==1)
if(Push(&
ss,e))
Push%dOK!
Push%dERROR!
inputdata:
(Terminatedbyinputingacharacter)"
getchar();
case3:
\n3-GetTopElement:
if(GetTop(&
ss,&
Topis%d"
StackisEmpty!
case4:
\n4-ReturnStackLength:
StackLengthis%d"
StackLength(&
ss));
case5:
\n5-StackIsEmpty:
StackisnotEmpty!
case6:
\n6-PopElement:
AllelementsofStack:
case7:
\n7-ClearStack:
ClearStack(&
ClearStackOK!
case8:
\n8-Conversion:
Conversion();
case9:
\n9-Correct:
Correct();
case0:
exit(0);
return0;
2、按照要求完成程序exp3_2.c,实现循环队列的相关操作。
•初始化队列;
•返回当前队列长度;
•连续入队2,4,6,8,10;
•获取当前队头元素;
•判断当前队列是否为空;
•队列元素依次出队;
exp3_2.c部分代码如下:
#defineMAXQSIZE100
typedefintQElemType;
/*
(1)---循环队列顺序存储表示*/
QElemType*base;
intfront;
intrear;
}SqQueue;
/*
(2)---构造一个空循环队列*/
intInitQueue(SqQueue*Q)
Q->
base=(QElemType*)malloc(MAXQSIZE*sizeof(QElemType));
Q->
front=Q->
rear=0;
}/*InitQueue*/
/*(3)---返回循环队列的长度*/
intQueueLength(SqQueue*Q)
returnQ->
rear-Q->
front;
}/*QueueLentgh*/
/*(4)---入队操作*/
intEnQueue(SqQueue*Q,QElemTypee)
if((Q->
rear+1)%MAXQSIZE==Q->
front)
base[Q->
rear]=e;
rear=(Q->
rear+1)%MAXQSIZE;
}/*EnQuese*/
/*(5)---出队操作*/
intDeQueue(SqQueue*Q,QElemType*e)
if(Q->
front==Q->
rear)
*e=Q->
front];
front=(Q->
front+1)%MAXQSIZE;
}/*DeQueue*/
/*(6)---判断队列是否为空*/
intQueueEmpty(SqQueue*Q)
rear==Q->
}/*QueueEmpty*/
/*(7)---取队头元素*/
intGetHead(SqQueue*Q,QElemType*e)
rear==Q->
front)//队列空的判断
*e=Q->
//将队头元素赋值给e
front=(Q->
front+1)%MAXQSIZE;
//front指针向后一位置,若到最后,则转到数组头部
}/*GetHead*/
/*销毁队列*/
intDestroyQueue(SqQueue*Q)
rear=Q->
front=0;
free(Q->
base);
}/*DestroyQueue*/
1.InitQueue\n"
/*初始化循环队列*/
2.GetQueueLength\n"
/*求队列的长度*/
3.EnQueue\n"
/*入队操作*/
4.GetHead\n"
/*取队头元素*/
5.QueueIsEmpty\n"
/*判断是否队空*/
6.DeQueue\n"
/*出队操作*/
/*销毁队列并退出*/
=8;
i++)
\nEnteryouchoice(0~6):
6);
/*主函数*/
SqQueueqq;
InitQueue(&
qq);
\n1-InitQueue:
if(InitQueue(&
qq))
\n2-GetQueueLength:
Queuelengthis%d"
QueueLength(&
qq));
\n3-EnQueue:
pleaseinputdata:
e);
if(EnQueue(&
qq,e))
%dEnQueueOK!
EnQueueError!
\n4-GetHead:
if(GetHead(&
qq,&
Headis%d\n"
GetHeadError!
\n5-QueueEmpty:
if(QueueEmpty(&
QueueisEmpty!
QueueisnotEmpty"
\n6-DeQueue:
Queueis:
while(!
QueueEmpty(&
if(DeQueue(&
DestroyQueue(&
3、递归(汉诺塔问题)
利用递归算法程序设计编写程序exp3_3.c,解决n阶汉诺塔问题(A柱为起始,C柱为目的)。
请将程序补充完整,并分别调试盘子数为3,7的情况。
exp3_3.c部分代码如下:
intstep=1;
voidhanoi(charA,intn,charB,charC)
if(n==1)
第%d步:
step++);
将%c柱子上唯一的1个盘子移到%c柱子!
A,C);
先将%c柱子上的多余的%d个盘子移到%c柱子中过程:
A,n-1,B);
hanoi(A,___n-1_____,C,____B_____);
将%c柱子上的最大的盘子移到%c柱子中!
接下来将%c柱子上的%d个盘子移到%c柱子中过程:
B,n-1,C);
hanoi(B,_____n-1____,A,___C____);
intn;
charA,B,C;
A='
A'
B='
B'
C='
C'
输入A柱子上盘子的个数:
n);
hanoi(A,n,B,C);
\n移动结束"
4、拓展实验:
设计程序实现简单四则算术运算。
要求说明:
(1)从键盘接收算术表达式,以“#”表示接收结束;
(2)输出算术表达式的值;
(3)操作数仅限于非负整数,操作符只能是+、-、*、/、^、(、)
(4)可以判断表达式的合法性(如括号的匹配)
提示:
借助栈来完成,将一个表达式转换为后缀表达式,并按照后缀表达式进行计算,得出表达式得结果。
【实验小结】