实验名称 栈的基本操作
实验目的
掌握栈这种抽象数据类型的特点及实现方法。
实验内容
从键盘读入若干个整数,建一个顺序栈或链式栈,并完成下列操作: (1)初始化栈; (2)判栈为空; (3)出栈; (4)入栈。
算法设计分析
(一)数据结构的定义
struct stackNode{ int data;
struct stackNode *nextPtr; };
typedef struct stackNode listStact; typedef listStact *stackNodePtr;
(二)总体设计
程序由主函数、入栈函数,出栈函数,删除函数判官是否为空函数和菜单函数组成。
(1) 主函数:调用各个函数以实现相应功能
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,返回;
2
Function5 int isEmpty(stackNodePtr sPtr) //是否为空 (1):判断sPtr是否为空;
实验测试结果及结果分析
(一) 测试结果 (1):一次想栈内输入1 2 3 4 5; (2):并显示栈元素;
(3):删除栈内元素;
3
实验总结
通过本次实验,加强了对栈的认识与相关操作的算法,了解一些编程技巧。实验中发现一处错误,便查找原因,后来才发现是现定义时写的与后面的不一样导致的错误。注意输入或输出时要判断栈是否为空,这是最为关键的,也是要细心的地方。
附录 实验程序代码
#include
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(\ //输入选择 while(choice!=3) //循环条件不等于3 {
switch(choice) //选择条件 { case 1:
printf(\请输入一个整数,并回车\\n\ scanf(\ //输入栈元素
push(&sPtr,item); //把item栈元素,赋值给sPtr头指针 printStack(sPtr); //输出栈中数据,从头指针开始输出 break; case 2:
if(!isEmpty(sPtr)) //头指针不为空是循环条件 {
printf(\删除栈顶的元素\\n\
pop(&sPtr); //删除头指针sPtr 上的数据
4