69,336
社区成员
发帖
与我相关
我的任务
分享
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <malloc.h>
#define MAX_SIZE 100
typedef int SElemType;
char LIST[]="0123456789ABCDEF";
typedef struct
{
SElemType data[MAX_SIZE];
int top;
}STACK;
int InitStack(STACK *s); //初始化栈
int Push(STACK *s, SElemType x); //压栈
int EmptyStack(STACK *s); //判断栈是否为空
int Pop(STACK *s, SElemType *x); //出栈
void DecToOthers(int n, int hex); //进制转换
int main(void)
{
int n, hex;
scanf("%d %d",&n,&hex);
DecToOthers(n,hex);
return 0;
}
/*
* * Function: ========初始化栈========
* * 形参:传入栈的指针,若成功初始化,则此指针指向栈
* * 返回值:0:初始化失败 1:初始化成功
* */
int InitStack(STACK *s)
{
/*
s=(STACK *)malloc(sizeof(STACK));
if (!s)
{
printf("分配空间失败!\n");
return 0;
}
*/
memset(s->data, 0, sizeof(s->data));
s->top=-1; //赋值为-1
return 1;
}
/*
* * Function:======将数据压入栈中======
* * 形参: S:指向栈的指针 x: 待压入的数据
* * 返回值:0:栈满,无法压入 1:压入成功
* */
int Push(STACK *s, SElemType x)
{
if (s->top==MAX_SIZE-1)
{
printf("\nStack is full!\n");
return 0;
}
s->top++;
s->data[s->top]=x;
return 1;
}
/*
* * Function:=======判断栈空=======
* * 形参:s: 指向栈的指针
* * 返回值:1:栈为空 0:栈不为空
* */
int EmptyStack(STACK *s)
{
return ((s->top==-1)?1:0);
}
/*
* * Function: ========出栈========
* * 形参:s: 指向栈的指针 x: 指向栈顶元素
* * 返回值:0:栈为空 1:出栈成功
* */
int Pop(STACK *s, SElemType *x)
{
if (EmptyStack(s))
{
printf("\nStack is free!\n");
return 0;
}
*x=s->data[s->top];
s->top--;
return 1;
}
/*
* * Functiom: ======进制转换======
* * 形参:n:十进制数 hex: 进制
* */
void DecToOthers(int n, int hex)
{
int x;
STACK st;
InitStack(&st);
while (n)
{
Push(&st, n%hex);
n/=hex;
}
while (!EmptyStack(&st))
{
Pop(&st, &x);
printf("%c",LIST[x]);
}
putchar(10);
}
问题主要是在InitStack函数里,st变量是结构体变量,而不是结构体指针,所以不需要在堆上申请空间。如果定义的st是指针,则需要如下操作;
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//#include <malloc.h>
#define MAX_SIZE 100
typedef int SElemType;
char LIST[]="0123456789ABCDEF";
typedef struct
{
SElemType data[MAX_SIZE];
int top;
}STACK;
int InitStack(STACK **s); //初始化栈
int Push(STACK *s, SElemType x); //压栈
int EmptyStack(STACK *s); //判断栈是否为空
int Pop(STACK *s, SElemType *x); //出栈
void DecToOthers(int n, int hex); //进制转换
int main(void)
{
int n, hex;
scanf("%d %d",&n,&hex);
DecToOthers(n,hex);
return 0;
}
/*
* * Function: ========初始化栈========
* * 形参:传入栈的指针,若成功初始化,则此指针指向栈
* * 返回值:0:初始化失败 1:初始化成功
* */
int InitStack(STACK **s)
{
*s=(STACK *)malloc(sizeof(STACK));
if (!(*s))
{
printf("分配空间失败!\n");
return 0;
}
memset((*s)->data, 0, sizeof((*s)->data));
(*s)->top=-1; //赋值为-1
return 1;
}
/*
* * Function:======将数据压入栈中======
* * 形参: S:指向栈的指针 x: 待压入的数据
* * 返回值:0:栈满,无法压入 1:压入成功
* */
int Push(STACK *s, SElemType x)
{
if (s->top==MAX_SIZE-1)
{
printf("\nStack is full!\n");
return 0;
}
s->top++;
s->data[s->top]=x;
return 1;
}
/*
* * Function:=======判断栈空=======
* * 形参:s: 指向栈的指针
* * 返回值:1:栈为空 0:栈不为空
* */
int EmptyStack(STACK *s)
{
return ((s->top==-1)?1:0);
}
/*
* * Function: ========出栈========
* * 形参:s: 指向栈的指针 x: 指向栈顶元素
* * 返回值:0:栈为空 1:出栈成功
* */
int Pop(STACK *s, SElemType *x)
{
if (EmptyStack(s))
{
printf("\nStack is free!\n");
return 0;
}
*x=s->data[s->top];
s->top--;
return 1;
}
/*
* * Functiom: ======进制转换======
* * 形参:n:十进制数 hex: 进制
* */
void DecToOthers(int n, int hex)
{
int x;
STACK *st;
InitStack(&st);
while (n)
{
Push(st, n%hex);
n/=hex;
}
while (!EmptyStack(st))
{
Pop(st, &x);
printf("%c",LIST[x]);
}
putchar(10);
}
这种情况下,建议再加上一个栈的销毁函数,用于free堆上的空间。