用c语言的链栈实现十进制转换成十六进制,分为建栈,判空,入栈,出栈,输出,以及进制转换的功能,最后用主函数根据需求选择功能使用
时间: 2024-05-11 18:17:24 浏览: 9
好的,这是一个比较复杂的问题,需要分步骤来实现。首先是建栈的代码实现:
```c
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#define STACK_INIT_SIZE 100 // 定义栈的初始大小
#define STACK_INCREMENT 10 // 定义栈的增量
typedef struct {
int *base; // 指向栈底的指针
int *top; // 指向栈顶的指针
int stacksize; // 当前已分配的存储空间,以元素为单位
} Stack;
// 初始化一个空栈
bool InitStack(Stack *S)
{
S->base = (int *)malloc(STACK_INIT_SIZE * sizeof(int));
if (!S->base) {
printf("分配内存失败!\n");
return false;
}
S->top = S->base;
S->stacksize = STACK_INIT_SIZE;
return true;
}
```
接下来是判空的代码实现:
```c
// 判断栈是否为空
bool StackEmpty(Stack S)
{
return S.top == S.base;
}
```
然后是入栈的代码实现:
```c
// 入栈
bool Push(Stack *S, int e)
{
// 栈满,追加存储空间
if (S->top - S->base >= S->stacksize) {
S->base = (int *)realloc(S->base, (S->stacksize + STACK_INCREMENT) * sizeof(int));
if (!S->base) {
printf("追加存储空间失败!\n");
return false;
}
S->top = S->base + S->stacksize;
S->stacksize += STACK_INCREMENT;
}
*(S->top++) = e;
return true;
}
```
接下来是出栈的代码实现:
```c
// 出栈
bool Pop(Stack *S, int *e)
{
if (StackEmpty(*S)) {
printf("栈为空,无法出栈!\n");
return false;
}
*e = *(--S->top);
return true;
}
```
然后是输出的代码实现:
```c
// 输出栈中的所有元素
void PrintStack(Stack S)
{
while (!StackEmpty(S)) {
int e;
Pop(&S, &e);
printf("%X", e);
}
printf("\n");
}
```
最后是进制转换的代码实现:
```c
// 十进制转换为十六进制
void DecimalToHex(int n)
{
Stack S;
InitStack(&S);
while (n) {
Push(&S, n % 16);
n /= 16;
}
PrintStack(S);
}
```
最后是主函数的代码实现,用户可以根据需求选择功能使用:
```c
int main()
{
int choice;
int n;
Stack S;
while (1) {
printf("请选择功能:\n");
printf("1. 初始化栈\n");
printf("2. 判断栈是否为空\n");
printf("3. 入栈\n");
printf("4. 出栈\n");
printf("5. 十进制转换为十六进制\n");
printf("0. 退出\n");
scanf("%d", &choice);
switch (choice) {
case 1:
InitStack(&S);
printf("初始化栈成功!\n");
break;
case 2:
if (StackEmpty(S)) {
printf("栈为空!\n");
} else {
printf("栈不为空!\n");
}
break;
case 3:
printf("请输入要入栈的元素:");
int e;
scanf("%d", &e);
if (Push(&S, e)) {
printf("入栈成功!\n");
} else {
printf("入栈失败!\n");
}
break;
case 4:
if (Pop(&S, &e)) {
printf("出栈成功,出栈元素为:%d\n", e);
} else {
printf("出栈失败!\n");
}
break;
case 5:
printf("请输入要转换的十进制数:");
scanf("%d", &n);
DecimalToHex(n);
break;
case 0:
return 0;
default:
printf("输入有误,请重新输入!\n");
break;
}
}
}
```
以上就是用 C 语言的链栈实现十进制转换成十六进制的全部代码实现,希望能对你有所帮助!