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

charles_su
  • 42
#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;
}
回复
阅读 2.2k
1 个回答

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

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏