#include <stdio.h>
#include <stdlib.h>
#define STACK_INIT_SIZE 100 //存储空间初始分配量
#define STACKINCREMENT 10 //存储空间分配增量
typedef struct
{
int *base; //栈底指针,在栈结构销毁之前,base值为NULL
int *top; //栈顶指针
int stacksize; //当前已经分配的存储空间(总空间),以元素为单位
} SqStack;
//初始化顺序栈,构造空栈
int Init_Sq(SqStack &S)
{
S.base = (int *)malloc(STACK_INIT_SIZE * sizeof(int)); //base指针指向这个区域,分配大小为int大小乘以最初分配的元素空间
if (!S.base)
return 0; //存储分配失败
S.top = S.base; //刚开始,栈顶指针和栈尾指针指向同一个元素
S.stacksize = STACK_INIT_SIZE; //初始元素个数
return 1;
}
int Destory_Sq(SqStack &S)
{
free(S.base); //释放分配的空间
S.base = NULL;
S.top = NULL;
S.stacksize = 0;
return 1;
}
int Clear_Sq(SqStack &S)
{
S.top = S.base; //栈顶指针与栈底指针指向同一元素
return 1;
}
int IfEmpty_Sq(SqStack S)
{
if (S.top == S.base)
{
return 1;
}
else
{
return 0;
}
}
int Length_Sq(SqStack S)
{
return S.top - S.base;
}
//返回栈顶元素
int GetTop(SqStack S, int &e)
{
if (S.top == S.base) //栈为空
{
return 0;
}
e = *(S.top - 1); //因为下标是从0开始的
return 1;
}
int Push(SqStack &S, int e) //进栈
{
if (S.top - S.base >= S.stacksize)
{
//栈满,增加存储空间
S.base = (int *)realloc(S.base,(S.stacksize + STACKINCREMENT) * sizeof(int));
if (!S.base)
{
return 0;
}
S.top = S.base + S.stacksize; //指向该栈的栈顶
S.stacksize = S.stacksize + STACKINCREMENT;
}
*(S.top) = e;
S.top++;
return 1;
}
int Pop(SqStack &S, int &e) //出栈
{
if (S.top == S.base) //该栈本为空栈,没有元素可以出栈
{
return 0;
}
S.top--; //先将该指针指向下一个位置(有元素)
e = *(S.top); //得到值
return 1;
}
int Traverse_Sq(SqStack S) //显示栈
{
int *p = S.base;
while (p < S.top)
{
printf("%d ", *p++);
}
printf("\n");
}
int main()
{
SqStack S;
int i;
int e;
int A;
printf("+--------------------菜单---------------------+\n");
printf("- 1.初始化顺序栈 -\n");
printf("- 2.销毁栈 -\n");
printf("- 3.置空栈 -\n");
printf("- 4.判断栈是否 -\n");
printf("- 5.返回栈中的元素个数 -\n");
printf("- 6.返回栈顶元素 -\n");
printf("- 7.将元素e压入栈 -\n");
printf("- 8.出栈,用e返回其值 -\n");
printf("- 9.遍历/访问顺序栈 -\n");
printf("- 10.退出程序 -\n");
printf("+---------------------------------------------+\n");
printf("\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
for (i = 0;; i++)
{
printf("请选择要使用的功能:");
scanf("%d", &A);
if(A > 10)
{
printf("没有该功能,请重新选择\n");
}
switch (A)
{
case 1:
Init_Sq(S);
if (Init_Sq(S))
{
printf("初始化成功\n");
}
else
{
printf("初始化失败\n");
}
break;
case 2:
Destory_Sq(S);
printf("操作完成\n");
break;
case 3:
Clear_Sq(S);
printf("操作完成\n");
break;
case 4:
IfEmpty_Sq(S);
if (IfEmpty_Sq(S))
{
printf("该栈为空\n");
}
else
{
printf("该栈不为空\n");
}
break;
case 5:
int t;
t = Length_Sq(S);
printf("该栈中有%d个元素\n", t);
break;
case 6:
GetTop(S,e);
printf("栈顶元素为%d\n",e);
break;
case 7:
printf("请输入e的值:",&e);
scanf("%d",&e);
Push(S,e);
printf("操作完成\n");
break;
case 8:
Pop(S,e);
printf("操作元素为值为%d\n",e);
break;
case 9:
Traverse_Sq(S);
printf("操作完成\n");
break;
case 10:
return 1;
}
}
}
数据结构之顺序栈
最新推荐文章于 2024-01-23 20:18:22 发布