入栈成功,出栈为什么会乱码

发布于 2022-09-04 03:43:39 字数 1658 浏览 18 评论 0

#include<iostream>
#include<stdio.h>
#define STACK_INIT_SIZE 100 //存储空间初始分配量
#define STACKINCREMENT 10//存储空间分配增量
typedef struct
{
    int *base;//在栈构造和销毁之后,base的值为NULL
    int *top;//栈顶指针
    int stacksize;//当前栈已分配的存储空间,以元素为单位
}Sqstack;
void InitStack(Sqstack &S)//构造一个空栈
{
    S.base = (int *)alloca(STACK_INIT_SIZE*sizeof(int));
    if (!S.base) exit(OVERFLOW);
    S.top = S.base;
    S.stacksize = STACK_INIT_SIZE; //存储空间初始分配量100
}
bool Push(Sqstack &S, int e)
{
    //插入元素e作为栈顶元素
    if (S.top - S.base >= S.stacksize)//栈满追加存储空间
    {
        S.base = (int *)realloc(S.base, (S.stacksize + STACKINCREMENT)*sizeof(int));
        if (!S.base) { exit(OVERFLOW); return false; }//分配失败
        S.top = S.base + S.stacksize;
        S.stacksize += STACKINCREMENT;
    }
    *S.top++= e;
    return true;
}//push
bool Pop(Sqstack &S, int &e)
{
    //若栈不空则删除栈顶元素,用e返回值,返回true,否则返回false
    if (S.top == S.base) return false;//空栈
    e = *--S.top;
    return true;
}//pop
bool IsEmpty(Sqstack S)
{
    //判断栈是否为空
    if (S.top == S.base)return true;
    return false;
}
void Conversion(int x)
{
    //转换10进制数
    Sqstack S;
    int temp;
    InitStack(S);//构造空栈
    if (x == 0)printf("0");
    else
    {
        while (x)
        {
            Push(S, x % 2);
            x /= 2;
        }//将10进制数短除,入栈
        while (!IsEmpty(S))
        {
            Pop(S, temp);
            printf("%d", temp);
        }//逆序输出
    }
    putchar(10);
}//Conversion
int main()
{
    printf("**************非递归算法**************\n");
    for (int i = 0; i < 16; i++)
    Conversion(i);
    system("pause");
    return 0;
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

梦屿孤独相伴 2022-09-11 03:43:39

Pop(S, &temp);
评论里看到有人提到alloca,窝才注意到,原来alloca是在栈上分配的内存。。。这种类型的内存会在调用它的函数结束后被系统自动回收

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文