题解主程序:
#include<myhead.h>
#include"stack.h"
// 数值转换
void Conversion(int num, int base)
{
stack_ptr s;
int x;
s = create_stack();
while (num > 0)
{
x = num % base;
stack_push(s,x);
num /= base;
}
printf("转换成%d进制为:", base);
while (!stack_empty(s))
{
x = stack_pop(s);
if (x < 10) // 数字小于10输出1到10
x += 48;
else //输出ABCDE
x += 55;
putchar(x);
}
stack_destroy(s);
printf("\n");
}
int main(void)
{
int num, base;
printf("请输入需要数制转换的十进制数:");
scanf("%d", &num);
printf("请输入要转换的进制数:");
scanf("%d", &base);
Conversion(num, base);
return 0;
}
头文件:
#ifndef STACK_H
#define STACK_H
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#define STACK_SIZE 10
typedef int datatype;
typedef struct stack_node
{
datatype *data;
int top;
} stack_node, *stack_ptr;
//创建栈
stack_ptr create_stack(void);
//判空
int stack_empty(stack_ptr S);
//判满
int stack_full(stack_ptr S);
//入栈
int stack_push(stack_ptr S, datatype data);
//出栈
datatype stack_pop(stack_ptr S);
//打印栈
void print_stack(stack_ptr S);
// 获取栈顶元素
datatype *get_top(stack_ptr S);
//销毁栈
void stack_destroy(stack_ptr S);
#endif
资源函数:
#include "stack.h"
// 创建栈
stack_ptr create_stack(void)
{
// 在堆区申请空间
stack_ptr S = (stack_ptr)malloc(sizeof(stack_node));
if (NULL == S)
{
printf("分配失败\n");
return NULL;
}
S->data = (datatype *)malloc(sizeof(datatype) * STACK_SIZE);
if (NULL == S->data)
{
printf("分配失败\n");
return NULL;
}
bzero(S->data, sizeof(datatype) * STACK_SIZE);
S->top = -1;
printf("创建成功\n");
return S;
}
// 判空
int stack_empty(stack_ptr S)
{
return S->top == -1;
}
// 判满
int stack_full(stack_ptr S)
{
return S->top == STACK_SIZE - 1;
}
// 入栈
int stack_push(stack_ptr S, datatype data)
{
if (NULL == S || stack_full(S))
{
printf("栈已满\n");
return -1;
}
S->top++;
S->data[S->top] = data;
printf("%d入栈成功\n", data);
return 0;
}
// 出栈
datatype stack_pop(stack_ptr S)
{
if (NULL == S || stack_empty(S))
{
printf("栈为空\n");
return -1;
}
// 出栈逻辑:先弹后减
//printf("%d\t出栈成功\n", S->data[S->top]);
datatype top = S->data[S->top];
S->top--;
return top;
}
// 打印栈
void print_stack(stack_ptr S)
{
if (NULL == S || stack_empty(S))
{
printf("栈为空\n");
return;
}
printf("从栈顶到栈底的元素分别是:\n");
for (int i = S->top; i >= 0; i--)
{
printf("%d\t", S->data[i]);
}
putchar(10);
return;
}
// 获取栈顶元素
datatype *get_top(stack_ptr S)
{
if (NULL == S || stack_empty(S))
{
printf("栈为空\n");
return;
}
return &S->data[S->top];
}
// 销毁栈
void stack_destroy(stack_ptr S)
{
if (S != NULL)
{
free(S->data);
S->data = NULL;
}
free(S);
S = NULL;
}