数据结构栈与队列C语言实现.docx
- 文档编号:4736206
- 上传时间:2022-12-08
- 格式:DOCX
- 页数:20
- 大小:25.50KB
数据结构栈与队列C语言实现.docx
《数据结构栈与队列C语言实现.docx》由会员分享,可在线阅读,更多相关《数据结构栈与队列C语言实现.docx(20页珍藏版)》请在冰豆网上搜索。
数据结构栈与队列C语言实现
数学与信息技术学院2016~2017(下)学年
计科专业2015级《数据结构》实验报告4
学号:
2015201018姓名:
汪继超
实验名称
栈的应用
完成时间
2017.05.03
一.实验目的和要求:
一.掌握栈和队列的概念及其两种数据结构的特点,懂得在什么样的问题中应用利用哪种结构。
二.熟练掌握在两种存储结构上实现栈的基本运算,特别注意栈满及栈空的条件及它们的描述方法。
掌握两个顺序栈共享存储空间的概念。
三.熟练掌握循环队列和链队列的基本运算,特别注意队满和队空的描述方法。
四.加强编辑与调试C语言程序的能力。
二.实验原理
栈和队列是两种特殊的线性表。
栈是限定只能在表的一端进行插入和删除的线性表,它又称为“后进先出”表;队列则是限定只能在表的一端进行插入,在表的另一端进行删除的线性表,它又称为“先进先出”表。
由于栈和队列都是线性表的一种特例,所以它们都可以使用顺序存储结构和链式存储结构,栈的顺序存储结构称为顺序栈,栈的链式存储结构称为链栈;而队列的顺序存储结构称为顺序队列,队列的链式存储结构称为链队。
顺序存储结构可用一维数组来实现,而链式存储结构可用指针来实现。
三.实验内容
假设称正读和反读都相同的字符序列为“回文”,试写一个算法判别读入的一个以”@”为结束符的字符序列是否是“回文”。
实验过程:
/*注:
此程序为栈的操作实现与应用*/
#include
#include
#include
#include
#include
#defineSTACK_INIT_SIZE100
#defineSTACKINCREMENT10
typedefintSElemType;
typedefintQElemType;
/*栈的存储结构*/
typedefstruct{
SElemType*base;/*栈低指针*/
SElemType*top;/*栈顶指针*/
intstacksize;/*栈当前已分配的所有空间,不是已使用的空间长度*/
}SqStack;
/*start***************队列的存储结构*********************/
typedefstructQNode{
QElemTypedata;
structQNode*next;
}QNode,*QueuePtr;
typedefstruct{
QueuePtrfront;
QueuePtrrear;
}LinkQueue;
/****************队列的存储结构********************end*/
/*函数声明*/
SElemTypeGetTop(SqStack*S);
voidPush(SqStack*S,SElemTypee);
boolSEmpty(SqStack*S);
SElemTypePop(SqStack*S);
voidmain();
//括号匹配-------------------------------------------------------start
voidmatch(SqStack*S)
{
charstr[20];
inti=0,flag;
fflush(stdin);
printf("\nPleaseenterastring:
");
scanf("%s",&str);
while(str[i]!
='\0'&&flag!
=0)
{
switch(str[i])
{
case'(':
Push(S,'(');
break;
case')':
if(*(S->top-1)=='(')
{
flag=1;
Pop(S);
}
elseflag=0;
break;
case'[':
Push(S,'[');
break;
case']':
if(*(S->top-1)=='[')
{
flag=1;
Pop(S);
}
elseflag=0;
break;
case'{':
Push(S,'{');
break;
case'}':
if(*(S->top-1)=='{')
{
flag=1;
Pop(S);
}
elseflag=0;
break;
default:
flag=0;break;
}
i++;
}
if((flag==1)&&(SEmpty(S)==0))
{
printf("\nsuccess!
\n");
}
elseprintf("\nerror!
\n");
}
//括号匹配-------------------------------------------------------end
//Queue逆置-------------------------------------------------------start
LinkQueue*InitQ()
{
LinkQueue*Q;
Q=(LinkQueue*)malloc(sizeof(LinkQueue));
Q->front=Q->rear=(QueuePtr)malloc(sizeof(QNode));
if(!
Q->front)exit
(1);
Q->front->next=NULL;
printf("SuccessfulQ!
");
returnQ;
}
voidEnQ(LinkQueue*Q,QElemTypee)//入队
{
QueuePtrp;
p=(QueuePtr)malloc(sizeof(QNode));
if(!
p)exit
(1);
p->data=e;
p->next=NULL;
Q->rear->next=p;
Q->rear=p;
}
intDeQ(LinkQueue*Q)//出队
{
inte;
QueuePtrp;
if(Q->front==Q->rear)return0;
else
{
p=Q->front->next;
e=p->data;
Q->front->next=p->next;
if(Q->rear==p)Q->rear=Q->front;
free(p);
returne;
}
}
voidalgo3(LinkQueue*Q,SqStack*S)//逆置
{
intd;
while(!
(Q->front==Q->rear))
{
d=DeQ(Q);
Push(S,d);
}
while(SEmpty(S))EnQ(Q,Pop(S));
}
voidtes(LinkQueue*Q,SqStack*S)//逆置主调函数
{
inti,e,n;
printf("\n您要输入的数据条数是:
");
scanf("%d",&n);
printf("\n请输入需逆置数据:
");
for(i=0;i { scanf("%d",&e); EnQ(Q,e); } algo3(Q,S); printf("\n逆置后的数据顺序: "); while(! (Q->front==Q->rear)) { printf("%3d",DeQ(Q)); } printf("\n"); free(Q); } //Queue逆置-------------------------------------------------------end //回文-------------------------------------------------------start voidHuiwen(LinkQueue*Q,SqStack*S) { charstr[20]; inti=0,flag; fflush(stdin); printf("\nPleaseenterastring: "); scanf("%s",&str); while(str[i]! ='\0') { Push(S,str[i]); EnQ(Q,str[i]); i++; } while(SEmpty(S)&&flag! =0) { if(DeQ(Q)==Pop(S))flag=1; elseflag=0; } if(flag==1) { printf("\nsuccess! \n"); } elseprintf("\nerror! \n"); } //回文-------------------------------------------------------end SqStack*InitStack()/*1.初始化栈*/ { SqStack*S; S=(SqStack*)malloc(sizeof(SqStack)); S->base=(SElemType*)malloc(STACK_INIT_SIZE*sizeof(SElemType)); if(! S||! S->base)exit (1); S->top=S->base; S->stacksize=STACK_INIT_SIZE; returnS; } boolSEmpty(SqStack*S)/*2.判栈空*/ { if(S->top==S->base)return0; elsereturn1;/*1表示栈不空*/ } voidPush(SqStack*S,SElemTypee)/*3.入栈*/ { if(S->top-S->base>=S->stacksize) { S->base=(SElemType*)realloc(S->base,(S->stacksize+STACKINCREMENT)*sizeof(SElemType)); if(! S->base)exit (1); printf("\n空间不够,开辟新空间成功! \n"); S->top=S->base+S->stacksize; S->stacksize+=STACKINCREMENT; } *S->top++=e; } SElemTypePop(SqStack*S)/*4.出栈*/ { if(S->top==S->base) { return0; printf("\nThesequencestackisempty! "); } elsereturn*(--S->top); } voiddisplay(SqStack*S)/*5.打印*/ { inte; SqStack*T; T=InitStack();/*1.新构建一个栈T*/ while(SEmpty(S)) { e=Pop(S); Push(T,e);/*2.将出栈打印的元素入栈T*/ printf("%5d",e);/*当栈不空依次打印*/ } while(SEmpty(T))Push(S,Pop(T));/*3.将栈T中元素出栈并入栈到栈S中*/ free(T); printf("\n"); } intStackLength(SqStack*S)/*6.统计栈长度*/ { printf("\n统计得栈的长度为: %d\n",(S->top-S->base)); return(S->top-S->base); } voidsearch(SqStack*S,SElemTypee)/*7.查找*/ { intcount=0,flag=0; SqStack*T; T=InitStack(); while(SEmpty(S)) { if(e==GetTop(S)) { count++; flag=1; printf("\n%d已找到元素: %d\n",count,e); } Push(T,Pop(S)); } while(SEmpty(T))Push(S,Pop(T)); free(T); if(flag==0)printf("\n没有找到元素: %d\n",e); } voidmodify(SqStack*S,SElemTypee)/*8.修改*/ { inte1,count=0,flag=0,a; SqStack*T; T=InitStack(); while(SEmpty(S)) { if(e==GetTop(S)) { count++; flag=1; printf("\n%d已找到元素: %d\n",count,e); printf("\n1.修改2.不修改: "); scanf("%d",&a); switch(a) { case1: e1=Pop(S); printf("\n将元素%d修改为: ",e); scanf("%d",&e1); Push(S,e1); printf("\n修改成功! \n"); //除输入1之外的情况都不做任何操作 } } Push(T,Pop(S)); } while(SEmpty(T))Push(S,Pop(T)); free(T); if(flag==0)printf("\n没有找到元素: %d\n",e); } voidClearStack(SqStack*S)/*9.清空栈*/ { S->top=S->base; printf("\n清空栈成功! \n"); } voidDestoryStatck(SqStack*S)/*10.销毁栈*/ { S->top=S->base; free(S->base); S->base=NULL; S->top=NULL; S->stacksize=0; free(S); printf("\n销毁栈成功! \n"); } SElemTypeGetTop(SqStack*S)/*11.取栈顶元素*/ { if(S->top==S->base) { printf("\nThesequencestackisempty! \n"); return0; } elsereturn*(S->top-1);/*区别于Pop中的*--S->top,*(S->top-1)不改变S->top指针的指向*/ } //进制转换模块----------------------------------------------------------------------start voidjinzhizhuanhuan(SqStack*S) { chara; intn,x,x1,q; do { do { system("cls"); printf("欢迎来到十进制转换为二至九进制桟运算中心\n\n"); printf("请输入您要转换为的进制数[2-9]: "); fflush(stdin); scanf("%d",&n); if(n>9||n<2) { printf("\n输入错误! 请重新输入! \n"); system("pause"); } }while(n>9||n<2); printf("\n请输入您要转换的十进制数: "); fflush(stdin); scanf("%d",&x); x1=x; while(x! =0) { q=x%n; x/=n; Push(S,q); } printf("\n%d转换成%d进制数为: ",x1,n);//display(S); while(SEmpty(S))printf("%d",Pop(S));/*当栈不空依次打印*/ printf("\n\n是否继续进行(yorn): "); fflush(stdin);//清空在此前输入缓冲区 a=getchar(); }while(a=='y'||a=='Y'); } //进制转换模块----------------------------------------------------------------------end //栈的全部操作实现模块---------------------------------------------------------------------start voidMenu2() { printf("栈的操作实现\n\n"); printf("************************************菜单**************************************\n"); printf("*1.初始化栈2.判栈空*\n"); printf("*3.入栈4.出栈*\n"); printf("*5.打印6.统计栈长度*\n"); printf("*7.查找8.修改*\n"); printf("*9.清空栈10.销毁栈*\n"); printf("*11.取栈顶元素0.退出*\n"); printf("******************************************************************************\n"); } voidcaozuoshixian(SqStack*S) { inti,e,n,c,flag; chara; system("cls"); do { Menu2(); printf("\n请选择你需要操作的步骤(0--11): "); fflush(stdin);/*清空在此前输入缓冲区*/ scanf("%d",&n); if(n>=0&&n<=11)flag=1; else { flag=0; system("cls"); printf("您输入有误,请重新选择! \n"); } }while(flag==0); while(flag==1) { switch(n)/*当程序执行到这里时,表明跳出上一个do-while*/ { case1: S=InitStack(); printf("\n初始化栈成功! \n");break;/*1.初始化栈,因为程序一开始做了初始化,所以这里是做重复工作,仅只是作为初学者强调栈初始化概念! */ case2: c=SEmpty(S); if(c==0)printf("\n当前栈为空! \n"); elseprintf("\n当前栈不为空! \n");break;/*2.判栈空*/ case3: printf("\n请输入您要入栈的元素条数: "); scanf("%d",&n); if(n<=0) { printf("\n输入不合法! \n");break; } printf("\n请依次输入入栈的元素: "); for(i=0;i { scanf("%d",&e); Push(S,e); } printf("\n数据录入成功! \n");break;/*3.入栈*/ case4: if(S->top==S->base)printf("\nThesequencestackisempty! \n"); elseprintf("\n元素%d已出栈! \n",Pop(S));break;/*4.出栈*/ case5: printf("\n栈当前数据: ");display(S);break;/*5.打印*/ case6: StackLength(S);break;/*6.统计栈长度*/ case7: printf("\n请输入您要查找的元素: "); scanf("%d",&e); search(S,e); break;/*7.查找*/ case8: printf("\n请输入您要修改的元素: "); scanf("%d",&e); modify(S,e); break;/*8.修改*/ case9: ClearStack(S);break;/*9.清空栈*/ case10: DestoryStatck(S);break;/*10.销毁栈*/ case11: if(S->top==S->base)printf("\nThesequencestackisempty! \n"); elseprintf("\n取得栈顶元素: %d\n",GetTop(S));break;/*11.取栈顶元素*/ case0: main();break; default: printf("\n您输入有误,请重新选择! \n");break;//gotostart; } printf("\n是否继续进行(yorn): "); fflush(stdin);//清空在此前输入缓冲区 a=getchar(); if(a=='y'||a=='Y') { flag=1; system("cls");/*清屏*/ Menu2();/*调用菜单函数*/ printf("请再次选择你需要操作的步骤(0--11): "); fflush(stdin);//清空在此前输入缓冲区 scanf("%d",&n); } elseflag=0; } } //栈的全部操作实现模块--------------------------------------------------------------------
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 队列 语言 实现