链栈的有关操作.docx
《链栈的有关操作.docx》由会员分享,可在线阅读,更多相关《链栈的有关操作.docx(7页珍藏版)》请在冰豆网上搜索。
![链栈的有关操作.docx](https://file1.bdocx.com/fileroot1/2023-1/5/a922d720-3c9b-4e88-a9ba-ab7a9af16613/a922d720-3c9b-4e88-a9ba-ab7a9af166131.gif)
链栈的有关操作
实验3:
栈的链接结构的有关操作
班级:
信息管理学号:
L11214022姓名:
吴翔翔日期:
2014-4-28
1.实验题目
请编制一个程序,利用栈的链接存储方式来实现下列功能:
(1)初始化链栈;
(2)入栈;
(3)通过入栈操作,编写一个n个元素连续入栈的算法:
LinkStack*setup_stack(intn),算法返回栈的头指针;
(4)输出一个链栈的所有元素;
(5)判断栈是否非空;//若栈空返回值为1,否则返回值为0
(6)入栈
2.需求分析
本演示程序在VC++6.0环境下编写调试,完成初始化链栈,将一个元素入栈及出栈,,多个元素连续入栈,还有判断栈是否为空等操作。
3、概要设计
A:
主函数main()
主函数里需要调用上述函数,大体思路是先调用初始化函数,然后输出“需要入栈的元素个数n”提示,接着进行n作为实参的值的输入,然后调用(3)中的那个setup_stack函数,输出栈中所有元素值,进行出栈几次,在输出栈中元素值。
B:
初始化函数*initstack()
主要是对栈进行初始化。
C:
输出栈中元素函数print(linkstack*top)
D:
入栈函数*push(linkstack*top,datatypex)
E:
出栈函数*pop(linkstack*top)
4.调试分析
主要叙述本程序调试过程的中所遇到主要问题及其体会:
本程序基本上与单链表相似,只不过其所有操作都限定在栈头进行操作。
本程序的基本操作并不太难,关键在于它的头指针唯一标示了该栈,调用子函数时有时无法进行,则必是头指针调用出了问题。
在调试过程中试了好多次,最后才成功。
5.测试结果(运行结果)
A:
初始化*initstack()
B:
n个元素连续入栈*setup_stack(linkstack*top,intn)
C:
一个元素入栈*push(linkstack*top,datatypex)
D:
元素出栈*pop(linkstack*top)
E:
判断栈是否非空;//若栈空返回值为1,否则返回值为0
6.源程序(带注释)
程序清单
#include
#include
#include
#definemaxsize50
typedefintdatatype;
/*typedefstruct{
datatypestack[maxsize];
inttop;
}seqstack;*/
typedefstructnode{
datatypedata;
structnode*next;
}linkstack;
//初始化函数
linkstack*initstack()
{
linkstack*top;
top=NULL;
returntop;
}
//输出栈中元素函数
voidprint(linkstack*top)
{linkstack*p;
p=top;
if(p==NULL)printf("empty");
else
{
do
{printf("%6d",p->data);
p=p->next;
}while(p!
=NULL);
printf("\n");
}
}
//出栈函数
linkstack*push(linkstack*top,datatypex)
{
linkstack*p;
p=(linkstack*)malloc(sizeof(linkstack));
p->data=x;
p->next=top;
top=p;
returntop;
}
intstackempty(linkstack*top)
{return(top?
0:
1);
}
//n个元素连续入栈函数
linkstack*setup_stack(linkstack*top,intn)
{inti,x;
for(i=0;i{scanf("%d",&x);
top=push(top,x);
}
print(top);
returntop;
}
linkstack*pop(linkstack*top)
{linkstack*q;
if(!
top){printf("栈为空");}
q=top;
top=top->next;
free(q);
returntop;
}
//主函数
voidmain()
{linkstack*top;
inti,x,k,n;
do{
printf("\n\n\n");
printf("\n====================================");
printf("\n\t1.初始化链栈;");
printf("\n\t2.将一个元素入栈");
printf("\n\t3.n个元素连续入栈");
printf("\n\t4.输出栈所有元素");
printf("\n\t5.判断栈是否非空;//若栈空返回值为1,否则返回值为0");
printf("\n\t6.出栈");
printf("\n=====================================");
printf("\n\t请输入您的选择(1、2、3、4、5、6)");
scanf("%d",&k);
switch(k)
{
case1:
{printf("已初始化链栈!
");
top=initstack();
}break;
case2:
{printf("请输入元素x值:
");
scanf("%d",&x);
top=push(top,x);
printf("输入元素后栈变为:
");
print(top);
}break;
case3:
{printf("请输入要入栈的元素个数n=:
");
scanf("%d",&n);
top=setup_stack(top,n);
}break;
case4:
{printf("当前栈中元素为");
print(top);
}break;
case5:
{printf("%d",stackempty(top));
}break;
case6:
{printf("出栈前栈中元素为:
");print(top);
top=pop(top);
printf("出栈后剩余栈中元素为:
");
print(top);
}break;
}
}while(k!
=0);
}