关键词搜索

源码搜索 ×
×

【数据结构】 详解栈

发布2022-03-27浏览521次

详情内容

栈的概念及其结构

栈:一种特殊的线性表其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端成为栈顶,另一端称为栈底。

元素遵循后进先出原则。

压栈:栈的插入称为进栈/压栈/入栈,入数据在栈顶。

出栈:栈的删除操作称为出栈。出数据在栈顶。

栈的实现

栈一般可以用数组或者链表实现,相对而言数组结构更优一些。

 

栈的实现一般是采用动态内存管理实现的。

 

准备环节:

  1. //以顺序表的形式
  2. typedef int STDataType;
  3. typedef struct Stack
  4. {
  5. STDataType* a;
  6. int top;//栈顶
  7. int capacity;//容量
  8. }Stack;

1.初始化

基本思路:1)断言

2)指针置空

3)栈顶,容量置为0

代码:

  1. //初始化
  2. void StackInit(Stack* ps)
  3. {
  4. ps->a = NULL;
  5. ps->capacity = ps->top = 0;
  6. }

2.入栈

基本思路:1)断言

2)判断顺序表是否需要扩容

3)插入数据

画图:

类似于顺序表的尾插

代码:

  1. //入栈
  2. void StackPush(Stack* ps, STDataType x)
  3. {
  4. //断言
  5. assert(ps);
  6. //判断是否需要扩容
  7. if (ps->top == ps->capacity)
  8. {
  9. int newcapacity = ps->capacity == 0 ? ps->capacity = 4 : ps->capacity * 2;
  10. STDataType* tmp = (STDataType*)realloc(ps->a, sizeof(STDataType) * newcapacity);
  11. //判断扩容是否成功
  12. if (tmp == NULL)
  13. {
  14. printf("realloc fail\n");
  15. exit(-1);
  16. }
  17. ps->a = tmp;
  18. ps->capacity = newcapacity;
  19. }
  20. //插入数据
  21. //数组的下标从0开始,top指向的就是栈顶
  22. ps->a[ps->top] = x;
  23. ps->top++;
  24. }

 

3.出栈

基本思路:类似于顺序表尾删

1)断言

2)将top--,退一位就行

画图:

代码:

  1. //出栈
  2. void StackPop(Stack* ps)
  3. {
  4. assert(ps);
  5. //断言栈是否为空
  6. assert(ps->top > 0);
  7. ps->top--;
  8. }

 

4.获取栈顶元素

基本思路:1)断言

2)断言栈是否为空

3)返回ps->a[ps->top-1]

画图:

可见top指向的是栈顶元素的下一位。

代码:

  1. //获取栈顶元素
  2. STDataType StackTop(Stack* ps)
  3. {
  4. assert(ps);
  5. //断言栈是否为空
  6. assert(ps->top);
  7. return ps->a[ps->top-1];
  8. }

 

5.检测栈是否为空

为空返回true非空返回false

基本思路:1)断言传递的指针

2)if判断句或者把 ps->top == 0 的结果返回

代码:

  1. //检测栈是否为空
  2. bool StackEmpty(Stack* ps)
  3. {
  4. assert(ps);
  5. 非空
  6. //if (ps->top > 0)
  7. //{
  8. // return false;
  9. //}
  10. 为空
  11. //else
  12. // return true;
  13. //更优化的写法
  14. return ps->top == 0;
  15. }

6.记录栈里数据个数

基本思路:1)断言

2)top指的值正是数据的个数。

画图:

 

此时栈数据个数为3,top的值为3.

代码:

  1. int StackSize(Stack* ps)
  2. {
  3. assert(ps);
  4. //返回个数,top指的是栈顶数据的下一位。
  5. return ps->top;
  6. }

 

7.销毁栈

基本思路:1)断言

2)free指针变量

3)容量和栈顶置为0

代码:

  1. //销毁
  2. void StackDestroy(Stack* ps)
  3. {
  4. free(ps->a);
  5. ps->a = NULL;
  6. ps->capacity = ps->top = 0;
  7. }

依靠已知接口打印栈数据

  1. #include"Stack.h"
  2. void test()
  3. {
  4. Stack st;
  5. StackInit(&st);
  6. StackPush(&st, 1);
  7. StackPush(&st, 2);
  8. StackPush(&st, 3);
  9. StackPush(&st, 4);
  10. //printf("%d ", StackTop(&st));
  11. while (!StackEmpty(&st))
  12. {
  13. printf("%d ", StackTop(&st));
  14. StackPop(&st);
  15. }
  16. printf("\n");
  17. StackDestroy(&st);
  18. }
  19. int main()
  20. {
  21. test();
  22. return 0;
  23. }

头文件:

  1. #include<stdio.h>
  2. #include<assert.h>
  3. #include<stdlib.h>
  4. #include<stdbool.h>
  5. //以顺序表的形式
  6. typedef int STDataType;
  7. typedef struct Stack
  8. {
  9. STDataType* a;
  10. int top;//栈顶
  11. int capacity;//容量
  12. }Stack;
  13. //初始化
  14. void StackInit(Stack* ps);
  15. //销毁
  16. void StackDestroy(Stack* ps);
  17. //入栈
  18. void StackPush(Stack* ps,STDataType x);
  19. //出栈
  20. void StackPop(Stack* ps);
  21. //获取栈顶元素
  22. STDataType StackTop(Stack* ps);
  23. //检测栈是否为空
  24. bool StackEmpty(Stack* ps);
  25. //获取栈有多少个数据
  26. int StackSize(Stack* ps);

相关技术文章

点击QQ咨询
开通会员
返回顶部
×
微信扫码支付
微信扫码支付
确定支付下载
请使用微信描二维码支付
×

提示信息

×

选择支付方式

  • 微信支付
  • 支付宝付款
确定支付下载