数据结构(C语言)栈的基本操作
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验名称栈的基本操作
实验目的
掌握栈这种抽象数据类型的特点及实现方法。
实验内容
从键盘读入若干个整数,建一个顺序栈或链式栈,并完成下列操作:
(1)初始化栈;
(2)判栈为空;
(3)出栈;
(4)入栈。
算法设计分析
(一)数据结构的定义
struct stackNode{
int data;
struct stackNode *nextPtr;
};
typedef struct stackNode listStact;
typedef listStact *stackNodePtr;
(二)总体设计
程序由主函数、入栈函数,出栈函数,删除函数判官是否为空函数和菜单函数组成。
(1)主函数:调用各个函数以实现相应功能
(三)各函数的详细设计:
Function1: void instruct() //菜单
(1):使用菜单显示要进行的函数功能;
Function2:void printStack(stackNodePtr sPtr) //输出栈
(1):利用if判断栈是否为空;
(2):在else内套用while(头指针不为空条件循环)循环输出栈元素;
Function3:void push(stackNodePtr *topPtr,int value //进栈
(1):建新的头指针;
(2):申请空间;
(3):利用if判断newPtr不为空时循环进栈
(4):把输入的value赋值给newPtr,在赋值给topPtr,再指向下一个位置;
Function4:int pop(stackNodePtr*topPtr) //删除
(1):建新的头指针newPtr;
(2):利用if判断newPtr是否为空,再删除元素。
(3):把topPtr等于newPtr,把头指针指向的数据赋值给topValue,输出要删除的数据值,头指针指向下一个位置,并清空newPtr;
(4):完成上述步骤后,return toPvalue,返回;
Function5int isEmpty(stackNodePtr sPtr) //是否为空(1):判断sPtr是否为空;
实验测试结果及结果分析
(一)测试结果
(1):一次想栈内输入1 2 3 4 5;
(2):并显示栈元素;
(3):删除栈内元素;
实验总结
通过本次实验,加强了对栈的认识与相关操作的算法,了解一些编程技巧。实验中发现一处错误,便查找原因,后来才发现是现定义时写的与后面的不一样导致的错误。注意输入或输出时要判断栈是否为空,这是最为关键的,也是要细心的地方。
附录实验程序代码
#include
struct stackNode
{
int data;
struct stackNode *nextPtr;
};
typedef struct stackNode listStact;
typedef listStact *stackNodePtr;
void push(stackNodePtr*,int); //入栈
int pop(stackNodePtr *); //删除
int isEmpty(stackNodePtr); //判断是否为空
void printStack(stackNodePtr); //输出栈
void instruct(); //菜单
int main()
{
int item; //入栈元素变量
int choice; //定义菜单选择变量
stackNodePtr sPtr=NULL; //先让头指针为空
instruct(); //输出菜单
scanf("%d",&choice); //输入选择
while(choice!=3) //循环条件不等于3
{
switch(choice) //选择条件
{
case 1:
printf("请输入一个整数,并回车\n");
scanf("%d",&item); //输入栈元素
push(&sPtr,item); //把item栈元素,赋值给sPtr头指针
printStack(sPtr); //输出栈中数据,从头指针开始输出
break;
case 2:
if(!isEmpty(sPtr)) //头指针不为空是循环条件
{
printf("删除栈顶的元素\n");
pop(&sPtr); //删除头指针sPtr 上的数据
printStack(sPtr); //输出栈中数据,从头指针开始输出
}
else
{
printf("栈中没有元素,无法删除\n"); //如果栈为空时,也就是头指针为空}
break;
default: //如果输入的不正确
printf("无效输入,请重新输入\n"); //选择输入不匹配
break;
}
instruct(); //输出菜单菜单循环
scanf("%d",&choice); //输入选择
}
}
void instruct() //菜单
{
printf("请选择下面的输入:\n"
"1:向栈中插入数据:\n"
"2:删除栈中的数据:\n"
"3:结束操作\n");
}
int isEmpty(stackNodePtr sPtr) //是否为空
{
return sPtr==NULL;
}
void printStack(stackNodePtr sPtr) //输出栈
{
if(sPtr==NULL) //当头指针为空时,(判断栈是否为空)
{
printf("空栈\n");
}
else //不为空时
{
printf("栈中的数据有:\n");
while(sPtr!=NULL) //循环条件头指针不为空
{