数据结构栈与队列C语言实现文档格式.docx
- 文档编号:17675269
- 上传时间:2022-12-08
- 格式:DOCX
- 页数:20
- 大小:25.50KB
数据结构栈与队列C语言实现文档格式.docx
《数据结构栈与队列C语言实现文档格式.docx》由会员分享,可在线阅读,更多相关《数据结构栈与队列C语言实现文档格式.docx(20页珍藏版)》请在冰豆网上搜索。
/*栈顶指针*/
intstacksize;
/*栈当前已分配的所有空间,不是已使用的空间长度*/
}SqStack;
/*start***************队列的存储结构*********************/
typedefstructQNode{
QElemTypedata;
structQNode*next;
}QNode,*QueuePtr;
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;
)'
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!
}
//括号匹配-------------------------------------------------------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);
front->
next=NULL;
SuccessfulQ!
"
returnQ;
voidEnQ(LinkQueue*Q,QElemTypee)//入队
QueuePtrp;
p=(QueuePtr)malloc(sizeof(QNode));
p)exit
(1);
p->
data=e;
rear->
next=p;
rear=p;
intDeQ(LinkQueue*Q)//出队
inte;
if(Q->
front==Q->
rear)return0;
else
p=Q->
next;
e=p->
data;
Q->
next=p->
if(Q->
rear==p)Q->
rear=Q->
front;
free(p);
returne;
voidalgo3(LinkQueue*Q,SqStack*S)//逆置
intd;
while(!
(Q->
rear))
d=DeQ(Q);
Push(S,d);
while(SEmpty(S))EnQ(Q,Pop(S));
voidtes(LinkQueue*Q,SqStack*S)//逆置主调函数
inti,e,n;
\n您要输入的数据条数是:
%d"
n);
\n请输入需逆置数据:
for(i=0;
i<
n;
i++)
scanf("
e);
EnQ(Q,e);
algo3(Q,S);
\n逆置后的数据顺序:
%3d"
DeQ(Q));
free(Q);
//Queue逆置-------------------------------------------------------end
//回文-------------------------------------------------------start
voidHuiwen(LinkQueue*Q,SqStack*S)
Push(S,str[i]);
EnQ(Q,str[i]);
while(SEmpty(S)&
if(DeQ(Q)==Pop(S))flag=1;
elseflag=0;
if(flag==1)
//回文-------------------------------------------------------end
SqStack*InitStack()/*1.初始化栈*/
SqStack*S;
S=(SqStack*)malloc(sizeof(SqStack));
S->
base=(SElemType*)malloc(STACK_INIT_SIZE*sizeof(SElemType));
S||!
S->
base)exit
(1);
top=S->
base;
stacksize=STACK_INIT_SIZE;
returnS;
boolSEmpty(SqStack*S)/*2.判栈空*/
if(S->
top==S->
base)return0;
elsereturn1;
/*1表示栈不空*/
voidPush(SqStack*S,SElemTypee)/*3.入栈*/
top-S->
base>
=S->
stacksize)
S->
base=(SElemType*)realloc(S->
base,(S->
stacksize+STACKINCREMENT)*sizeof(SElemType));
if(!
\n空间不够,开辟新空间成功!
base+S->
stacksize;
stacksize+=STACKINCREMENT;
*S->
top++=e;
SElemTypePop(SqStack*S)/*4.出栈*/
base)
return0;
\nThesequencestackisempty!
elsereturn*(--S->
top);
voiddisplay(SqStack*S)/*5.打印*/
SqStack*T;
T=InitStack();
/*1.新构建一个栈T*/
while(SEmpty(S))
e=Pop(S);
Push(T,e);
/*2.将出栈打印的元素入栈T*/
%5d"
e);
/*当栈不空依次打印*/
while(SEmpty(T))Push(S,Pop(T));
/*3.将栈T中元素出栈并入栈到栈S中*/
free(T);
intStackLength(SqStack*S)/*6.统计栈长度*/
\n统计得栈的长度为:
%d\n"
(S->
base));
return(S->
base);
voidsearch(SqStack*S,SElemTypee)/*7.查找*/
intcount=0,flag=0;
if(e==GetTop(S))
count++;
flag=1;
printf("
\n%d已找到元素:
count,e);
Push(T,Pop(S));
if(flag==0)printf("
\n没有找到元素:
voidmodify(SqStack*S,SElemTypee)/*8.修改*/
inte1,count=0,flag=0,a;
if(e==GetTop(S))
\n1.修改2.不修改:
scanf("
a);
switch(a)
case1:
e1=Pop(S);
printf("
\n将元素%d修改为:
scanf("
e1);
Push(S,e1);
\n修改成功!
//除输入1之外的情况都不做任何操作
voidClearStack(SqStack*S)/*9.清空栈*/
\n清空栈成功!
voidDestoryStatck(SqStack*S)/*10.销毁栈*/
{
free(S->
base=NULL;
top=NULL;
stacksize=0;
free(S);
\n销毁栈成功!
SElemTypeGetTop(SqStack*S)/*11.取栈顶元素*/
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"
欢迎来到十进制转换为二至九进制桟运算中心\n\n"
请输入您要转换为的进制数[2-9]:
fflush(stdin);
if(n>
9||n<
2)
\n输入错误!
请重新输入!
system("
pause"
}while(n>
2);
\n请输入您要转换的十进制数:
fflush(stdin);
x);
x1=x;
while(x!
q=x%n;
x/=n;
Push(S,q);
\n%d转换成%d进制数为:
x1,n);
//display(S);
while(SEmpty(S))printf("
Pop(S));
\n\n是否继续进行(yorn):
//清空在此前输入缓冲区
a=getchar();
}while(a=='
y'
||a=='
Y'
//进制转换模块----------------------------------------------------------------------end
//栈的全部操作实现模块---------------------------------------------------------------------start
voidMenu2()
栈的操作实现\n\n"
************************************菜单**************************************\n"
*1.初始化栈2.判栈空*\n"
*3.入栈4.出栈*\n"
*5.打印6.统计栈长度*\n"
*7.查找8.修改*\n"
*9.清空栈10.销毁栈*\n"
*11.取栈顶元素0.退出*\n"
******************************************************************************\n"
voidcaozuoshixian(SqStack*S)
inti,e,n,c,flag;
system("
Menu2();
\n请选择你需要操作的步骤(0--11):
/*清空在此前输入缓冲区*/
if(n>
=0&
n<
=11)flag=1;
else
flag=0;
您输入有误,请重新选择!
}while(flag==0);
while(flag==1)
switch(n)/*当程序执行到这里时,表明跳出上一个do-while*/
case1:
S=InitStack();
\n初始化栈成功!
/*1.初始化栈,因为程序一开始做了初始化,所以这里是做重复工作,仅只是作为初学者强调栈初始化概念!
*/
case2:
c=SEmpty(S);
if(c==0)printf("
\n当前栈为空!
elseprintf("
\n当前栈不为空!
/*2.判栈空*/
case3:
\n请输入您要入栈的元素条数:
if(n<
\n输入不合法!
\n请依次输入入栈的元素:
for(i=0;
Push(S,e);
\n数据录入成功!
/*3.入栈*/
case4:
if(S->
base)printf("
\n元素%d已出栈!
/*4.出栈*/
case5:
printf("
\n栈当前数据:
display(S);
/*5.打印*/
case6:
StackLength(S);
/*6.统计栈长度*/
case7:
\n请输入您要查找的元素:
search(S,e);
/*7.查找*/
case8:
\n请输入您要修改的元素:
modify(S,e);
/*8.修改*/
case9:
ClearStack(S);
/*9.清空栈*/
case10:
DestoryStatck(S);
/*10.销毁栈*/
case11:
\n取得栈顶元素:
%d\n"
GetTop(S));
/*11.取栈顶元素*/
case0:
main();
default:
\n您输入有误,请重新选择!
//gotostart;
\n是否继续进行(yorn):
if(a=='
/*清屏*/
Menu2();
/*调用菜单函数*/
请再次选择你需要操作的步骤(0--11):
//清空在此前输入缓冲区
//栈的全部操作实现模块--------------------------------------------------------------------
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 队列 语言 实现