一 .栈的含义 以及 应用:
1.含义:栈(stack)是限定仅在表位进行插入删除操作的线性表
2.数据进出顺序为:先进后出,和弹夹压入的子弹一样,先压进去的最后才能射出;
3.应用场景:网页浏览时的后退 编辑软件中的“撤销”;
二.代码展示:
1.接口一览
void InitStack(SqStack *s);//顺序栈的初始化
void StackEmpty(SqStack S);//顺序栈判断栈是否为空
void StackLength(SqStack S);//求顺序栈长度
void ClearStack(SqStack *s);//清空顺序栈
void DestroyStack(SqStack*s);//销毁顺序栈
void Push(SqStack*s, SElemType e);//顺序栈入栈(压入子弹)
void Pop(SqStack*s);//顺序栈出栈(射出子弹)
void StackPrint(SqStack S);//栈的打印
2.具体代码
#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 100
typedef int SElemType;
typedef struct
{
SElemType * base;//栈底指针
SElemType * top;//栈顶1指针
int stacksize;//栈的最大容量
}SqStack;
void InitStack(SqStack *s)//初始化
{
(*s).base = (SElemType*)malloc(MAXSIZE*sizeof(SElemType));
if ((*s).base == NULL)
exit(-1);
(*s).top = (*s).base;
(*s).stacksize = MAXSIZE;
printf("初始化完成\n\n");
}
void StackEmpty(SqStack S)//检测是否为空
{
printf("栈检测开始\n");
if (!S.base)
{
printf("检测结果:栈不存在(可能没有初始化,也可能被销毁)\n");
}
else if (S.top==S.base)
{
printf("检测结果:栈为空\n");
}
else
{
printf("检测结果:栈不为空\n");
}
}
void StackLength(SqStack S)//检测长度
{
int Length=S.top - S.base;
printf("栈的长度为:%d\n",Length);
}
void ClearStack(SqStack *s)//清理栈
{
if ((*s).base)//保证栈已经初始化
{
(*s).top = (*s).base;//不用管之前存储在内存中的东西,只需要让S.top = S.base就行
printf("栈清理完成\n");
}
else
{
printf("栈没有初始化\n");
}
}
void DestroyStack(SqStack *s)//销毁栈
{
if ((*s).base)
{
free((*s).base);//释放之前申请的空间
(*s).stacksize = 0;
(*s).base = (*s).top = NULL;
}
}
void Push(SqStack *s, SElemType e)//元素入栈
{
if ((*s).top - (*s).base == (*s).stacksize)//栈满条件
{
printf("栈满\n");
}
else
{
*((*s).top) = e;//*(S.top)表示截取到S.top指向的内容
(*s).top++;
}
}
void Pop(SqStack *s)//元素出栈
{
if ((*s).top == (*s).base)
{
printf("栈已经为空,没有元素可以出栈\n");
}
(*s).top--;
SElemType e = *(*s).top;
printf("出栈元素为%d\n", e);
}
void StackPrint(SqStack S)//从栈顶开始打印,如果想从栈底打印,移动base指针即可
{
S.top--;
printf("栈中元素为:");
while (S.top - S.base >= 0)
{
printf("%d ", *(S.top));
S.top--;
}
printf("\n\n");
}
void test()
{
SqStack S;//完成这步之后,S里面的东西都是随机的
InitStack(&S);
Push(&S, 1);
Push(&S, 2);
Push(&S, 3);
Push(&S, 4);
Push(&S, 5);
StackPrint(S);
Pop(&S);
Pop(&S);
Pop(&S);
StackPrint(S);
StackLength(S);
ClearStack(&S);
StackEmpty(S);
DestroyStack(&S);
StackEmpty(S);
}
int main()
{
test();
return 0;
}