链栈顺序栈实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第五次实验报告——
顺序栈、链栈的插入和删除一需求分析
1、在演示程序中,出现的元素以数字出现定义为int型,
2、演示程序在计算机终端上,用户在键盘上输入演示程序中规定的运算命令,相应的输入数据和运算结果显示在终端上
3、顺序栈的程序执行的命令包括如下:
(1)定义结构体
(2)顺序栈的初始化及创建
(3)元素的插入
(4)元素的删除
(5)顺序栈的打印结果
3、链栈的程序执行的命令包括如下:
(1)定义结构体
(2)链栈的初始化及创建
(3)元素的插入
(4)元素的删除
(5)链栈的打印结果
二概要设计
1、顺序栈可能需要用到有序表的抽象数据类型定义:ADT List{
数据对象:D={ai|ai∈ElemL, i=1,2,...,n, n≥0}
数据关系:R1={
基本操作:
InitStack(SqStack &S)
操作结果:构造一个空栈
Push(L,e)
操作结果:插入元素e为新的栈顶元素
Status Pop(SqStack &S)
操作结果:删除栈顶元素
}ADT List;
2、链栈可能需要用到有序表的抽象数据类型定义:ADT List{
数据对象:D={ai|ai∈ElemL, i=1,2,...,n, n≥0}
数据关系:R1={
基本操作:
LinkStack(SqStack &S)
操作结果:构造一个空栈
Status Push(L,e)
操作结果:插入元素e为新的栈顶元素
Status Pop(SqStack &S)
操作结果:删除栈顶元素}ADT List;
3、顺序栈程序包含的主要模块:
(1) 已给定的函数库:
(2)顺序栈结构体:
(3)顺序栈初始化及创建:
(4)元素插入
(5)元素删除
(6)主程序:
4、链栈程序包含的主要模块:
(1) 已给定的函数库:
(2)链栈结构体:
(3)链栈初始化及创建:
(4)元素插入
(5)元素删除
(6)主程序:
三详细设计
线性栈:
结构体
#define STACK_INIT_SIZE 100//存储空间初始分配量
#define STACKINCREMENT 10//存储空间分配增量
typedef struct
{
int *base;//在构造栈之前和销毁之后,base的值为NULL
int *top;//栈顶指针
int stacksize;//当前已分配的存储空间,以元素为单位
}SqStack#include"Base.h"
主函数
#include"construction.h"
#include"stack_operation.c"
int main()
{
SqStack S;
int choice,e;
S=InitStack();
S=Input_Sq(S);
printf("请选择执行的操作,输入1执行入栈操作,输入2执行出栈操作choice=");
scanf("%d",&choice);
switch(choice)
{
case 1:
{
printf("请输入插入元素的值e=");
scanf("%d",&e);
S=Push(S,e);
printf("执行入栈操作后的线性栈为");
Print_Stack(S);
};break;
case 2:
{S=Pop(S);
printf("执行出栈操作后的线性栈为");
Print_Stack(S);
};break;
default : printf("您输入的值不合法");
}
}
线性栈的创建
SqStack InitStack()//线性栈的创建
{
SqStack S;
S.base=(int*)malloc(STACK_INIT_SIZE * sizeof(int));//分配存储空间
if(!S.base)
exit(OVERFLOW);//存储分配失败S.top=S.base;
S.stacksize=STACK_INIT_SIZE;
return S;
}
输入函数
SqStack Input_Sq(SqStack S)//输入函数{
int n,i;
printf("请输入元素个数n=");
scanf("%d",&n);
printf("请输入%d个元素",n);
for(i=0;i { scanf("%d",S.top); S.top++; } return S; } 进栈函数 SqStack Push(SqStack S,int e)//进栈函数 { if(S.top-S.base>=S.stacksize)//判断栈是否为满,追加存储空间{ S.base=(int*)realloc(S.base,(S.stacksize+STACKINCREMENT)*siz eof(int)); if(!S.base) exit(OVERFLOW);//存储分配失败 S.top=S.base+S.stacksize; S.stacksize+=STACKINCREMENT; } *S.top++=e;//插入元素 return S; } 出栈函数 SqStack Pop(SqStack S)//删除函数 { int e; if(S.top==S.base) printf("线性栈为空"); e=*--S.top;