题目:利用顺序栈实现将任意10进制数转换成对应的二进制,八进制,16进制输出
思路:利用短除法的原理以及栈先进后出的特点,先构建好一个顺序栈,这里我用的是数组,把每一次整除的余数压进栈里,然后再把栈里的数据依次取出,输出的便是对应进制的结果,需要注意的是十六进制比较特殊,得判断输出字母的情况
代码如下:
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112#include <stdio.h> #include <string.h> #include <stdlib.h> #define N 50 enum bool{false,true}; //定义枚举型辅助判断 struct stack //用一个结构体来定义栈 { int inter[N]; //存放栈真实数据的数组 int top; //栈顶元素 }; struct stack *S_init() //栈的初始化 { struct stack *S = malloc(sizeof(struct stack)); if(S == NULL) //判断内存分配 { printf("内存分配失败n"); return NULL; } bzero(S,sizeof(struct stack)); //清空结构体 S->top = -1; //初始化top return S; } enum bool stack_empty(struct stack *S) //判断栈是否为空 { if(S->top == -1) return true; else return false; } enum bool stack_full(struct stack *S) //判断栈是否满了 { if(S->top == N-1) return true; else return false; } enum bool stack_push(struct stack *S,int x) //入栈(插入新元素) { if(!stack_full(S)) //栈不满时插入 { S->inter[++S->top] = x; return true; } else { printf("栈已满,无法入栈!n"); return false; } } int stack_pop(struct stack *S)//退栈 { if(!stack_empty(S)) //栈不为空的时候,取出栈顶元素 { if(S->inter[S->top] == 10)//判断十六进制时每一位输出字母的情况 printf("A"); else if(S->inter[S->top] == 11) printf("B"); else if(S->inter[S->top] == 12) printf("C"); else if(S->inter[S->top] == 13) printf("D"); else if(S->inter[S->top] == 14) printf("E"); else if(S->inter[S->top] == 15) printf("F"); else printf("%d",S->inter[S->top]); //打印栈顶元素 S->top--; } else printf("栈是空的n"); } int SysConvert(int n,int m)//进制转换,n为需要转换的十进制数,m为目标进制 { struct stack *St = S_init(); while(n) { if(stack_push(St,n%m)) //将每一次的余数压入栈 n = n/m; else break; } printf("转换后的结果为:"); while(!stack_empty(St)) { stack_pop(St); } return 0; } int main(int argc, char const *argv[]) { int m,n; printf("请输入你要转换的十进制数:"); while(1) { if(scanf("%d",&n) && getchar() == 'n')//判断输入的合法性 break; printf("输入不合法,请重新输入:"); while(getchar() != 'n'); } printf("请输入要转换的进制:"); while(1) { if(scanf("%d",&m)&&((m == 2)||(m == 8)||(m == 16))&&(getchar() == 'n'))//判断输入的合法性 break; printf("输入进制数不合法,请重新输入:"); while(getchar() != 'n'); } SysConvert(n,m); printf("n"); return 0; }
PS:我用的是Linux下的gcc编译,貌似不支持bool型,运行报错,所以我定义了一个枚举类型来判断,当然也可以用宏定义。输入的时候增加了合法性的判断,运行结果如下
刚学栈没多久,程序不足之处希望大家指出。
最后
以上就是坚定向日葵最近收集整理的关于利用顺序栈(基于数组)实现十进制转换输出其他进制数的全部内容,更多相关利用顺序栈(基于数组)实现十进制转换输出其他进制数内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复