一 . 栈的含义 以及 应用:
1.含义:栈(stack)是限定仅在表的一段进行插入删除操作的线性表
2.数据进出顺序为:先进后出,和弹夹压入的子弹一样,先压进去的最后才能射出;
3.应用场景:网页浏览时的后退 编辑软件中的“撤销”;
二. 栈的存储结构的选择:
1.数组:选用数组来做栈的存储结构,只需要在数组末尾进行操作即可,完美的避开了数组操作中挪动数据的缺陷,显然可以选择数组来做栈的存储结构
2.单链表:因为栈是在线性表的一段进行操作,所以得想想实在链表头操作,还是在链表尾操作。
如果选用链表尾,那每次都得找到链表尾部,不方便(是可以设置尾指针,但是就多了一个尾指针得空间);
如果选用链表头,那每次只需要在链表头操作即可,操作更为方便
3.数组 和 单链表的头插头删 那个更好?
一般情况下,我们选用数组,因为数组的空间是物理连续的,CPU预加载时,可以加载一段空间;
而链表的空间不是物理连续的,CPU预加载时,只能加载一个结点;
因此,使用 单链表头插头删 来做栈的存储结构的效率更高;
#define _CRT_SECURE_NO_WARNINGS 1 #include#include #include #include typedef int STDataType; typedef struct Stack { STDataType *a; int top; int capacity; }ST; void StackInit(ST *ps)//初始化 { ps->a = (STDataType*)malloc(sizeof(STDataType)* 4);//先创建4个STDataType大小的内存 if (ps->a == NULL) { printf("malloc fail!n"); exit(-1); } ps->top = 0;//top初始为0时,top指向的就不是栈尾元素,而是栈尾的下一个元素 ps->capacity = 4;//数组的空间大小为4 } void StackDestory(ST *ps)//销毁 { assert(ps);//判断ps是否为空,如果他为空就说明栈还没有创建,也就不用销毁 free(ps->a);//释放数组a的空间 ps->a = NULL;//让指针*a 指向空 ps->top = ps->capacity = 0; } void StackPush(ST *ps, int x)//入栈 { assert(ps); //满了,得增容 if (ps->top == ps->capacity)//注意:top从0开始的。并且top指向栈尾元素的下一个地址 { STDataType *tmp= (STDataType*)realloc(ps->a,sizeof(STDataType)*ps->capacity*2); //设置tmp,申请空间成功后,将其赋给ps->a //如果直接用ps->a,申请内存失败后,ps->a就不对劲了 if (tmp == NULL)//判断是否申请成功 { printf("realloc failn"); exit(-1); } else { ps->a = tmp; ps->capacity *= 2;//扩大为原来的2倍 } } ps->a[ps->top] = x; ps->top++; } void StackPop(ST *ps)//出栈 { assert(ps); assert(ps->top > 0);//判断是否栈空 ps->top--; } STDataType StackTop(ST *ps)//取栈顶元素(并不删除栈顶元素) { assert(ps); assert(ps->top > 0);//判断是否栈空 return ps->a[ps->top-1]; } int StackSize(ST *ps)//求栈中元素个数 { assert(ps); return ps->top; } bool StackEmpty(ST *ps)//判断是否为空 { assert(ps); return ps->top == 0; } int main() { ST st; StackInit(&st); StackPush(&st, 1); StackPush(&st, 2); StackPush(&st, 3); printf("%d ", StackTop(&st)); StackPop(&st); //StackTop(&st)和StackPop(&st)是搭配使用的,这样才能模仿出栈的操作特性 printf("%d ", StackTop(&st)); StackPop(&st); StackPush(&st, 4); StackPush(&st, 5); StackPush(&st, 6); StackPush(&st, 7); while (!StackEmpty(&st)) { printf("%d ", StackTop(&st)); StackPop(&st); } printf("n"); StackDestory(&st); return 0; }
StackTop(&st)和StackPop(&st)是搭配使用的,这样才能模仿出栈的操作特性



