C语言 利用栈实现不同进制数之间的转换。要求输入一个十进制整数N,通过堆栈实现十进制整数到二进制数

2024-11-30 09:49:27
推荐回答(1个)
回答1:

#include 
#include 
#include 

#define elemType int /* 链栈元素数据类型 */
#define SNODE_SIZE sizeof (struct sNode) /* 链栈结点空间大小 */

#define status int /* 状态型变量 */
#define OVERFLOW -1 /* 内存溢出状态码 */
#define ERROR 0 /* 错误状态码 */
#define OK 1 /* 正确状态码 */

/* 链栈结点存储结构 */
typedef struct sNode {
elemType data;
struct sNode *next;
} sNode, *sNodePtr;

/* 链栈存储结构 */
typedef struct linkStack {
sNodePtr top; /* 栈顶指针 */
} linkStack;

/* 初始化 */
/* 操作结果:构造一个带头结点的空链栈S */
void initStack (linkStack *S) {
S->top = (sNodePtr) malloc (SNODE_SIZE); /* 产生头结点,栈顶指针指向此头结点 */
if (!S->top) /* 内存分配失败 */
exit (OVERFLOW);
S->top->next = NULL;
}

/* 销毁 */
/* 初始条件:链栈S已存在。操作结果:销毁链栈S */
void destroyStack (linkStack *S) {
sNodePtr p, q;

p = S->top; /* p指向S的头结点 */
while (p) {
q = p->next; /* q指向p的下一个结点 */
free (p); /* 回收p指向的结点 */
p = q; /* p移动到下一个结点 */
} /* 直到没有下一个结点 */
}

/* 判断链栈是否为空 */
/* 初始条件:链栈S已存在。操作结果:若S为空链栈,则返回TRUE,否则返回FALSE */
status stackIsEmpty (linkStack *S) {
return S->top->next == NULL;
}

/* 入栈 */
/* 操作结果:在S的栈顶插入新的元素e */
status push (linkStack *S, elemType e) {
sNodePtr p;

p = (sNodePtr) malloc (SNODE_SIZE); /* 产生新结点 */
if (!p) /* 内存分配失败 */
exit (OVERFLOW);

p->data = e;
p->next = S->top->next; /* 将新结点链接到原栈顶 */
S->top->next = p; /* 栈顶指向新结点 */
}

/* 出栈 */
/* 操作结果:删除S的栈顶元素,并由e返回其值 */
status pop (linkStack *S, elemType *e) {
sNodePtr p;

if (stackIsEmpty (S))
return ERROR;

p = S->top->next; /* p指向链栈的第一个结点 */
*e = p->data; /* 取出数据 */
S->top->next = p->next;
free (p); /* 删除该结点 */

    if (S->top == p) /* 栈为空 */
     S->top->next = NULL;
    
    return OK;
}

int main (void) {
linkStack S;
elemType e;
int N;

initStack (&S);

    scanf ("%d", &N);

/*除基数取余*/
    while (N) {
     push (&S, N%2);
     N /= 2;
    }

while (!stackIsEmpty (&S)) {
pop (&S, &e);
printf ("%d", e);
}

destroyStack (&S);

getch (); /* 屏幕暂留 */
return 0;
}

如有问题,点击头像联系我