实验2 栈实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验二栈
一、实验目的
1、掌握栈的结构特性及其入栈,出栈操作;
2、对栈相应算法的时间复杂度进行分析;
3、理解栈数据结构的特点(优缺点);
4、掌握栈的概念。
二、实验环境
windowsXP microsoft visual studio
三、实验内容
利用栈实现数据的分类,要求当输入为偶数时进栈当输入为奇数时进栈2,最后分别从栈1和栈2输出偶数和奇数序列。
栈是限定插入和删除只能在表的“端点”进行的线性表。
栈的定义和特点:
定义:限定仅在表尾进行插入或删除操作的线性表,表尾—栈顶,表头—栈底,不含元素的空表称空栈。
特点:先进后出(FILO)或后进先出(LIFO)
1、顺序栈:栈的顺序存储结构是利用一组地址连续的存储单元依次存放自栈底至
栈顶的数据元素,即同时附设指针top指示栈顶元素在顺序栈中的位置。类似于线性表的顺序映象实现,指向表尾的指针可以作为栈顶指针。
//-----栈的顺序存储表示 -----
#define STACK_INIT_SIZE 100;
#define STACKINCREMENT 10;
typedef struct {
SElemType *base;
SElemType *top;
int stacksize;
} SqStack;
栈底指针base,始终指向栈底位置;栈顶指针top,其初值指向栈底,始终在栈顶元素的下一个位置。
2、链栈:栈的链式存储结构是利用一个结点指针来实现的,结点由两部分组成,一部分是结点的数据域,另一部分是指针域,用next指针指示结点的后继,从而实现链式存储。栈的链式存储结构。栈顶指针就是链表的头指针。
3、入栈函数程序如下:
int Push(SqStack *S,ElemType e){
if(S->top-S->base>=S->stacksize){
S->base=(ElemType *)realloc(S->base,(S->stacksize+STACKINCREMENT) *sizeof(ElemType));
if(!S->base) return ERROR;
S->top=S->base+S->stacksize;
S->stacksize+=STACKINCREMENT;}
*S->top++=e;
return OK;
}/*Push*/
4、出栈函数程序如下:
int Pop(SqStack *S,ElemType *e){
if(S->top==S->base)return ERROR;
*e=*--S->top;
return OK;
}/*Pop*/
三、实验运行结果如下
四、算法分析:输入元素序列1 2 3 4 5,为什么输出序列为5 4 3 2 1?体现了栈的什么特性?
答:1、push函数算法分析:它是一个元素入栈函数,首先判断栈是否已满,若栈已满,就申请栈空间,当输入一个数据时,栈顶指针top加一,始终指向栈顶元素的上面,当1 2 3 4 5入栈后,指针top指在5的上面空格里,此时push函数已执行结束。
2、pop函数算法分析:它是一个元素出栈的函数,首先判断栈是否已空,
若栈不为空,就执行程序中栈顶元素出栈的语句。每次栈顶元素出栈时,栈顶指针top 先自减一,然后把所指元素输出,即执行语句{e=--S->top}。此时,输出序列为5 4 3 2 1。这体现了栈的先进后出,后进先出的特性。