/*郭睿玥第三次算法实验作业*/ /*实验原理 栈是一种受限的线性表,由于规定了栈的入栈与出栈只能在一端进行,故而产生了后进先出, 先进后出的结果,因而常应用于具有这种特性的问题中进行模拟,广泛使用于程序设计中。 顺序栈是栈的顺序映像的实现,可采用静态顺序存储结构和动态存储结构,在静态顺序存储时 需分配一个预先设定大小的数组与栈顶指示器,规定若栈为空则栈顶指示器为-1,否则栈顶指示器 指向当前栈顶元素,栈满则栈顶指示器为预先设定的值减1,入栈时需栈顶指示器加1,此时元素入 栈即可,出栈时将当前栈顶指示器指向的元素返回,栈顶指示器减1即可。动态存储时需动态申请 预先设定的空间交给栈底指针,对栈操作时栈底指针不动,栈顶指针移动,为方便操作可将栈的长 度封装进来,动态实现的优点在于若空间不够时,可再申请一个增量的空间进行补充,但缺点是较 静态而言稍复杂一些。 */ /*实验环境 CodeBlocks*/ /*实验目的 掌握顺序栈的基本操作:初始化栈、判栈空、入栈、出栈、取栈顶数据元素等运算及程序实现方法。 */ /*实验内容 (1)定义栈的顺序存取结构。 (2)分别定义顺序栈的基本操作(初始化栈、判栈空、入栈、出栈等)。 (3)设计一个测试主函数进行测试。 (4)根据自己的理解添加更多的内容。 */ /*算法实现如下*/ # include <stdio.h> # include <malloc.h> # include <stdlib.h> #define STACK 5// 初始化栈的最大长度 #define STACKINCREMENT 3// 若栈最大空间不够时,需要增加的长度 typedef int Status;// 定义函数返回值类型 typedef int SElemType; // 定义每条数据的结构体类型 typedef struct { SElemType *top;// 栈顶指针 SElemType *bottom;// 栈底指针 SElemType stacksize;// 栈的最大长度 }stack; Status initstack(stack *s) { s->bottom=(SElemType*) malloc(sizeof(SElemType)*STACK ); // 分配初始空间 if(!s->bottom) return 0; s->top=s->bottom;// 栈顶与栈底相同 s->stacksize=STACK;// 栈的最大长度等于初始长度 printf("创建成功\n"); return 1; } Status push(stack *s,SElemType e)// 进栈,参数e是要进栈的元素 {// 若栈的最大长度不会够用时,重新开辟,增大长度 if(s->top-s->bottom>=s->stacksize) { s->bottom=(SElemType*)realloc(s->bottom,sizeof(SElemType)*(s->stacksize+ STACKINCREMENT)); if (!s->bottom) return 0; s->top=s->bottom+s->stacksize ;// 栈顶指针为栈底指针加上栈之前的最大长度 s->stacksize+=STACKINCREMENT; // 栈当前的最大长度等于栈之前的最大长度与增加的长度之和 } *s->top++=e;// 先赋值,后栈顶指针上移 return 1; } Status stackempty(stack *s)// 判断栈是否为空,只需要判断栈顶指针与栈底指针是否相同即可 { if(s->bottom==s->top) { printf("是空栈\n"); return 1; } return 0; } void clearstack(stack *s) { if(!stackempty(s)) s->top = s->bottom; printf("清空成功\n"); return 0; } Status DestroyStack(stack *s )// 销毁栈,释放栈空间,栈顶栈底指针置为NULL,长度置为0 { free(s->bottom); s->stacksize = 0; s->bottom = s->top = NULL; printf("销毁成功\n"); return 0; } Status pop(stack *s)// 出栈 { if(stackempty(s)) return 0; s->top--; return 1; } Status getop(stack*s)// 获取栈顶的元素,参数e用来存放栈顶的元素 { SElemType e; if(stackempty(s)) return 0; e=*(s->top-1); return e; } Status traverse(stack*s)// 遍历栈,依次打印每个元素 { if(stackempty(s)) return 0; SElemType * p; p=s->top;// 由栈顶依次向下遍历 while (p!=s->bottom) { p--; printf("%d",*p); printf("\n"); } return 1; } int main() { stack S; int choice; do {/*显示操作界面*/ printf("***********************\n"); printf("* 1. 构建空栈*\n"); printf("* 2. 清空栈*\n"); printf("* 3. 栈的判空*\n"); printf("* 4. 压栈*\n"); printf("* 5. 弹栈 *\n"); printf("* 6. 获取栈顶元素\n"); printf("* 7. 显示全部元素\n"); printf("* 8. 销毁栈\n"); printf("* 0. 退出。 *\n"); printf("***********************\n"); printf("\n"); printf("请选择你要操作的选项:"); scanf("%d", &choice);//输入需要进行的选项 printf("\n"); switch (choice) { case 1:{ initstack(&S); break; } case 2:{ clearstack(&S); break; } case 3:{ stackempty(&S); break; } case 4:{ int i, n, f; printf("输入你想要入栈的元素个数:\n"); scanf("%d", &n); for (i = 1; i <= n; i++) { printf("请输入新一项"); scanf("%d", &f); push(&S, f); } break; } case 5:{ pop(&S); break; } case 6:{ printf("%d\n",getop(&S)); break; } case 7:{ traverse(&S); break; } case 8:{ DestroyStack(&S); break; } case 0:{ printf("\n退出系统成功!请按任意键结束!\n");//退出程序 exit(0); } break; } } while (choice);//只要选择不为需要进行的功能不为0则该程序可以一直进行下去 } /*以下是实验结果 操作界面如下 1. 构建空栈* 2. 清空栈* 3. 栈的判空* 4. 压栈* 5. 弹栈 6. 获取栈顶元素 7. 显示全部元素 8. 销毁栈 0. 退出。 郭睿玥 算法与数据结构第三次作业 (以下内容中操作界面的显示已经省略) 输入 请选择你要操作的选项:1 创建成功 请选择你要操作的选项:3 是空栈 请选择你要操作的选项:4 请输入你要入栈元素的个数;4 请输入新的一项;6 请输入新的一项7 请输入新的一项5 请输入新的一项9 请选择你要操作的选项:5 请选择你要操作的选项:6 5 请选择你要操作的选项:7 5 7 6 请选择你要操作的选项:2 清空成功 请选择你要操作的选项:8 销毁成功 请选择你要操作的选项:0 退出系统成功! */