/*郭睿玥第三次算法实验作业*/
/*实验原理
栈是一种受限的线性表,由于规定了栈的入栈与出栈只能在一端进行,故而产生了后进先出,
先进后出的结果,因而常应用于具有这种特性的问题中进行模拟,广泛使用于程序设计中。
顺序栈是栈的顺序映像的实现,可采用静态顺序存储结构和动态存储结构,在静态顺序存储时
需分配一个预先设定大小的数组与栈顶指示器,规定若栈为空则栈顶指示器为-1,否则栈顶指示器
指向当前栈顶元素,栈满则栈顶指示器为预先设定的值减1,入栈时需栈顶指示器加1,此时元素入
栈即可,出栈时将当前栈顶指示器指向的元素返回,栈顶指示器减1即可。动态存储时需动态申请
预先设定的空间交给栈底指针,对栈操作时栈底指针不动,栈顶指针移动,为方便操作可将栈的长
度封装进来,动态实现的优点在于若空间不够时,可再申请一个增量的空间进行补充,但缺点是较
静态而言稍复杂一些。
*/
/*实验环境
CodeBlocks*/
/*实验目的
掌握顺序栈的基本操作:初始化栈、判栈空、入栈、出栈、取栈顶数据元素等运算及程序实现方法。
*/
/*实验内容
(1)定义栈的顺序存取结构。
(2)分别定义顺序栈的基本操作(初始化栈、判栈空、入栈、出栈等)。
(3)设计一个测试主函数进行测试。
(4)根据自己的理解添加更多的内容。
*/
/*算法实现如下*/
# include
# include
# include
#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
退出系统成功!
*/