鱼C论坛

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

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

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

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

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

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

原理:

注意:
        这里需要注意,在malloc这个位置我发生了错误,我只申请了E->base的空间没有申请,E这个指针的空间最后导致报错,这个位置需要申请两次空间,还有释放内存时i是从零开始的,总数是从1开始,的所以我多释放了一个不是malloc的空间造成报错。
        还有以后多用函数,把每一个关键代码用函数装载,这样有助于后期出错查找、更改、输出、提高兼容性。
        还有注意不要出现奇怪的数组,比如这次我就出现了,ASCALL码中的'0'的十进制表示方式48,应该用'0'种表达方式。

备注:
        1.本次作业题特别感谢“人造人”予以的指点及的启发谢谢(附原始链接)
        “人造人”对本题目的批改

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

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



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


代码:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <stdbool.h>
#define MAXSIZE 100

typedef int Elemtype;

//建立类
typedef struct
{
    Elemtype *base;     //尾指针
    Elemtype *top;      //头指针
    int StackSize;      //剩余空间
}SqStack;

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

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

void DeStack(SqStack **E)          //释放内存
{
    free((*E)->base);
    free(*E);
}

Elemtype PopStack(SqStack *E)           //出栈
{
    E->top--;
    E->StackSize++;
    return *(E->top);
}

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

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

    if(!(*E)->base)
    {
        printf("内存分配失败本程序结束运行\n");          //判断是内存地址是否分配成功
        exit(0);
    }
    (*E)->top = (*E)->base;         //把初始地址传给头指针
    (*E)->StackSize = MAXSIZE;      //初始剩余空间数量
}
int main()
{
    SqStack *T = (SqStack *)malloc(sizeof(SqStack ));
    char litte[32];
    int  N = 0;

    InitStack(&T);

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

    for(int i = 0; litte[i] != 0; i++ )
    {
        litte[i] = litte[i] - '0';
        PushStack(&T,litte[i]);
    }

    for(int i = 0;!StackEmpty(T); i++)
    {
        N += PopStack(T) * pow(2, i);
    }

    printf("%d\n", N);

    DeStack(&T);
    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-22 07:30

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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