鱼C论坛

 找回密码
 立即注册
查看: 2454|回复: 0

[学习笔记] 栈、进栈、出栈、二进制转八进制

[复制链接]
发表于 2021-10-29 18:14:39 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 奥普瓯江 于 2021-10-30 17:43 编辑

原理:

备注:

        这里有一个错误就是在释放malloc上,因为我对malloc函数理解有问题,所以造成了,多次释放
  1. void DeStack(SqStack **E)          //释放内存
  2. {
  3.     Elemtype *temp;

  4.     for(int i = 0; i < ((*E)->StackSize); i++)
  5.     {
  6.         temp = (*E)->base;
  7.         (*E)->base++;
  8.         free(temp);
  9.     }
  10.     free(*E);
  11. }
复制代码

运行错误
我一共用malloc在能存中申请了MAXSIZE个空间,是一次性申请的所以释放也应该是一次性的,我只需要释放一次(*E)->base但是我在这个程序中却释放了,(*E)->StackSize次所以在调试时会出现内存泄漏,或者时提示,用vs6.0进行调试会出现以下提示

1.png

在CodeBlock中调试会出现执行free(temp);这个代码第三遍后出现错误结束程序





代码:

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <math.h>
  4. #include <stdbool.h>
  5. #define MAXSIZE 100

  6. typedef int Elemtype;

  7. //建立类
  8. typedef struct
  9. {
  10.     Elemtype *base;     //尾指针
  11.     Elemtype *top;      //头指针
  12.     int StackSize;      //剩余空间
  13. }SqStack;

  14. void InitStack(SqStack **E);        //初始化创建空栈
  15. void PushStack(SqStack **E, Elemtype N);          //进栈
  16. Elemtype PopStack(SqStack *E);          //出栈
  17. void DeStack(SqStack **E);          //释放内存
  18. bool StackEmpty(SqStack *E);        //判断真假

  19. bool StackEmpty(SqStack *E)        //判断真假
  20. {
  21.     return E->top == E->base;
  22. }

  23. void DeStack(SqStack **E)          //释放内存
  24. {
  25.     free((*E)->base);
  26.     free(*E);
  27. }

  28. Elemtype PopStack(SqStack *E)           //出栈
  29. {
  30.     E->top--;
  31.     E->StackSize++;
  32.     return *(E->top);
  33. }

  34. void PushStack(SqStack **E, Elemtype N)          //进栈
  35. {
  36.     if((*E)->top - (*E)->base >= (*E)->StackSize)
  37.     {
  38.         (*E)->base = (Elemtype *)realloc((*E)->base, ((*E)->StackSize + MAXSIZE) * sizeof(Elemtype ));      //复制前面的base中的数据进入到扩大后的base中
  39.         if(!(*E)->base)
  40.         {
  41.             printf("内存分配失败本程序结束运行\n");          //判断是内存地址是否分配成功
  42.             exit(0);
  43.         }
  44.         (*E)->top = (*E)->base + (*E)->StackSize;           //因为以是新的内存空间所有,top中标记的地址也是错误的,所以按照以占用多少空间从新赋予top地址(realloc已经把数据复制过来了)
  45.         (*E)->StackSize = (*E)->StackSize + MAXSIZE;        //从新赋予记述节点数据
  46.     }
  47.     *((*E)->top) = N;
  48.     (*E)->top++;
  49.     (*E)->StackSize--;

  50. }
  51. void InitStack(SqStack **E)        //初始化创建空栈
  52. {
  53.     *E = (SqStack *)malloc(sizeof(SqStack ));
  54.    (*E)->base = (Elemtype *)malloc(MAXSIZE * sizeof(Elemtype ));   //向指针类中的base赋予空间

  55.     if(!(*E)->base)
  56.     {
  57.         printf("内存分配失败本程序结束运行\n");          //判断是内存地址是否分配成功
  58.         exit(0);
  59.     }
  60.     (*E)->top = (*E)->base;         //把初始地址传给头指针
  61.     (*E)->StackSize = MAXSIZE;      //初始剩余空间数量
  62. }
  63. int main()
  64. {
  65.     SqStack *T, *F;

  66.     char litte[32];
  67.     Elemtype N = 0;

  68.     InitStack(&T);
  69.     InitStack(&F);

  70.     //把ASCII传给字符串
  71.     scanf("%s", litte);

  72.     for(int i = 0; litte[i] != 0; i++ )
  73.     {
  74.         litte[i] = litte[i] - '0';
  75.         PushStack(&T,litte[i]);
  76.     }

  77.     //转八进制
  78.     while(!StackEmpty(T))
  79.     {
  80.        for(int i = 0; i < 3 && !StackEmpty(T); i++)
  81.        {
  82.            N += PopStack(T) * pow(2, i);        //倒着出栈运算
  83.        }
  84.        PushStack(&F,N);                         //在进栈
  85.        N = 0;
  86.     }
  87.     while(F->top != F->base)
  88.     {
  89.         printf("%d", PopStack(F));              //打印栈中的每一个数据
  90.     }

  91.     DeStack(&T);
  92.     DeStack(&F);
  93.     return 0;
  94. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-2 09:23

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表