栈和队列的基本运算.docx
《栈和队列的基本运算.docx》由会员分享,可在线阅读,更多相关《栈和队列的基本运算.docx(15页珍藏版)》请在冰豆网上搜索。
栈和队列的基本运算
实验三栈和队列的基本运算
一、实验目的
(1)掌握栈和队列的各种存储结构及基本运算的实现。
(2)掌握堆栈后进先出运算原则在解决实际问题中的应用。
(3)掌握队列先进先出运算原则在解决实际问题中的应用。
(4)掌握递归程序设计的特点和编程方法。
二、实验要求:
(1)熟练掌握栈和队列的基本运行及其操作。
(2)理解实训案例的算法,掌握线栈和队列在实际中的运用。
(3)将上机程序全部调试通过。
(4)独立完成一个至两个实训项目,保存程序运行结果,并结合程序进行分析。
三、实验内容:
(1)任意输入一个字符串,按反序输出。
要求字符串从键盘随机输入,字符长度不做具体限制。
实现时,以链栈为手段。
(2)设计一个算法,判定一个字符串是否是对称字符串。
若是,则返回1,否则返回0。
(3)括号配对检查。
试设计一个程序对任意输入的语句或数学表达式,判断其符号是否匹配。
若匹配,则返回1;否则返回0。
(4)编写递归和非递归程序,计算下列表达式的值
1n=0
2xn=1
n>1
(5)舞伴问题。
假设在周末舞会上,男士和女士各自组成一排,跳舞开始的时候,依次从男队和女队上各出一人配成舞伴。
若两队初始人数不相同,则较长的那一队中未匹配对者等待下一轮舞曲。
现要求写一篇算法模拟上述舞伴配对的问题。
四、程序代码:
1
#include
#include
typedefcharElemType;
typedefstructsnode{
ElemTypedata;
structsnode*next;
}LinkSTACK;
voidInitStack(LinkSTACK**top)
{*top=(LinkSTACK*)malloc(sizeof(LinkSTACK));
(*top)->next=NULL;
}
intpush(LinkSTACK**top,ElemTypex)
{LinkSTACK*s;
s=(LinkSTACK*)malloc(sizeof(LinkSTACK));
s->data=x;
s->next=(*top)->next;
(*top)->next=s;
return1;
}
intEmpty(LinkSTACK**top)
{
return((*top)->next==NULL?
1:
0);}
intPop(LinkSTACK**top,ElemType*x)
{
LinkSTACK*s;
if(Empty(top)){
printf("Stackisfree!
\n");
return0;
}
s=(*top)->next;
*x=s->data;
(*top)->next=s->next;
return1;
}
voidmain()
{charch;
LinkSTACK*top;
InitStack(&top);
printf("请输入一字串");
while((ch=getchar())!
='\n')push(&top,ch);
printf("\n");
while(!
Empty(&top)){
Pop(&top,&ch);
printf("%c",ch);
}
}
2
#include
#include
#defineMAXSIZE40
typedefcharElemType;
typedefstruct{
ElemTypedata[MAXSIZE];
inttop;
}STACK;
voidInitStack(STACK*S)
{S->top=-1;}
intPush(STACK*S,ElemTypex)
{if(S->top==MAXSIZE-1){
printf("Stackisfull\n");
return0;
}
S->top++;
S->data[S->top]=x;
return1;
}
intEmpty(STACK*S)
{return(S->top==-1?
1:
0);}
intPop(STACK*S,ElemType*x)
{if(Empty(S)){
printf("Stackisfree!
\n");
return0;
}
*x=S->data[S->top];
S->top--;
return1;
}
main()
{STACKst;
charstr[100],ch;inti,len,same=1;
InitStack(&st);
printf("请输入一字串:
");
gets(str);
len=strlen(str);
for(i=0;iPush(&st,str[i]);
if(len%2==0)i=len/2;
elsei=(len+1)/2;
while(!
Empty(&st)){
Pop(&st,&ch);
if(ch!
=str[i]){same=0;break;}
i++;
}
if(same)printf("%s是对称字串!
",str);
elseprintf("%s不是对称字串!
",str);
}
3
#include
#include
#defineMAXSIZE40
typedefcharElemType;
typedefstruct{
ElemTypedata[MAXSIZE];
inttop;
}STACK;
voidInitStack(STACK*S)
{s->top=-1;}
intPush(STACK*S,ElemTypex)
{if(s->top==MAXSIZE-1){
printf("Stackisfull!
\n");
return0;
}
s->top++;
s->data[s->top]=x;
return1;
}
intEmpty(STACT*S)
{retutrn(s->top==-1?
1:
0);}
intpop(STACK*S,ElemType*x)
{if(Empty(s)){
printf("\nstackisfree!
");
return0;
}
*x=s->data[s->top];
s->top--;
return1;
}
intmatch(char*exps)
{STACKst;
intpos=0,intyesmatch=1;
while(exps[i]&&yesmatch){
switch(exps[pos]){
case'(':
case'[':
case'{':
Push(&st,eps[pos]);break;
case')':
case']':
case'}':
pop(&st,&ch);
if(ch!
=exps[pos])yesmatch=0;break;
}
pos++;
}
return(yesmatch&&Empty(&st))?
1:
0;
}
main()
{charstr[100];
intyesmatch;
printf("请输入一字串:
");
gets(str);
yesmatch=match(str);
if(yesmatch)
printf("是匹配是字串!
");
else
printf("不是匹配的字串!
");
}
4
#include
doublep(intn,intx)
{
doublef;
if(n==0)f=1;
elseif(n==1)f=2*x;
elsef=2*x*p(n-1,x)-2*(n-1)*p(n-2,x);
returnf;}
#include
#defineMAXSIZE40
typedefstruct{
intn;intx;}ElemType;
typedefstruct{
ElemTypedata[MAXSIZE];
inttop;
}STACK;
voidInitStack(STACK*S)
{S->top=-1;}
doublep(intn,doublex)
{STACKst;
inti;
doublef1=1,
doublef2=2*x,
InitStack(&st);
for(i=n;i>=2,i--){
st.top++;
st.data[st.top].n=i;
}
while(top>=0){
st.data[st.,top].x=2*x*f2-2*(st.data[st.top].n-1)*f1;
f1=f2;
f2=st.data[st.top].x;
st.top--;}
returnf2;}
main()
{intn;
doublex;
printf("请输入n与x的值:
");
scanf("%d%f",&n,&x);
printf("\n表达式值为%1f:
",p(n,x));
}
5
#include
typedefstruct{
charname[20];
charsex;
}ElemType;
typedefstructqnode{
Elemtypedata;
structqnode*next;
}QTYPE;
typedefstructqptr{
QTYPE*front,*rear;
intcount;
}SQUEUE;
voidInitQueue(SQUEUE*LQ)
{QTYPE*p;
p=(QTYPE*)malloc(sizeof(QTYPE));
p->next=NULL;
LQ->front=LQ->rear=p;
LQ->count=0;
}
intEnQueue(SQUEUE*LQ,ELemTypex)
{QTYPE*s;
s=(QTYPE*)malloc(sizeof(QTYPE));
s->data=x;
s->next=LQ->rear->next;
LQ->rear->next=s;
LQ->count++;
return1;
}
intEmpty(SQUEUE*LQ)
{return(LQ->front==LQ->rear?
1:
0);}
intOutQueue(SQUEUE*LQ,ElemType*x)
{QTYPE*p;
if(Empty(LQ)){
printf("\nQueueisfree!
");
return0;
}
p=LQ->front->next;
*x=p->data;
LQ->front->next=p->next;
LQ->count--;
if(LQ->front->next==NULL)
LQ->rear=Lq->front;
free(p);
return1;
}
intGetHead(SQUEUE*LQ,ElemType*x)
{if(Empty(LQ)){
printf("\nQueueisfree!
");
return0;
}
*x=LQ->front->next->data;
return1;
}
voidDancePartner()
{FILE*fp;
ElemTypep;
SQUEUEmdancer,fdancer;
InitQueue(&mdancer);InitQueue(&fdancer);
if((fp=fopen("dancer.dat","r"))==NULL){
printf("can\'topenthefile!
");
exit(0);
}
while(!
feof(fp){
p.sex=fgetc(fp);
fgetc(fp);
fgets(fp,10,p.name);
if(p.sex=='F')
EnQueue(&fdancer,p);
else
EnQueue(&mdancer,p);
}
printf("舞伴是:
\n");
while(!
Empty(&fdancer)&&!
Empty(&mdancer)){
outQueue(&fdancer,&p);
printf("%s",p.name);
OutQueue(&mdancer.&p);
printf("%s",p.name);
}
if(!
Empty(&fdancer)){
printf("\n还有%d个女士等下一轮。
\n",fdancer.count);
GetHead(&fdancer,&p);
printf("%swillbethefirsttogetapartner.\n",p,name);
}
elseif(!
Empty(mdancer)){
printf("\n还有%d个男士等下一轮。
\n",dmancer.count);
GetHead(&mdancer,&p);
printf("%s将得到第一个舞伴\n",p.name);
}
}
五、实验结果:
六、通过这次写实验报告,我深切的理解了这门课的本质。
刚开始学这门课时,当时还不清楚这门课程的目的,现在,我真正的理解了:
数据结构像是身体的骨骼,而C语言是填充这骨骼的肉体,二者相结合才能使整个程序更加完整,健全。
数据结构是个框架,模型,抽象数据类型中列举了各种操作,而所用的C语言,将各种操作描述出来构成算法。
数据结构+算法=程序设计。
在这次设计的过程中,我还遇到了,很多的问题。
顺序表是按顺序存储的,用了一维数组来存储,又结合C的程序设计,我又用了类,但是,在执行时出现了问题。
后来问同学,指出我的错误,不过获益不少。
我又重新整理思路,把顺序表的基本操作写好了。
虽然走了很多弯路,但是让我认识到,一定要创新,大胆,不能按照旧的思路去干新的事情。
这次的实验报告,让我受益匪浅,不仅有知识方面的,还有生活和精神上的。
总之,我会继续我的兴趣编程,相信在编程的过程中,能不断的提高自己。