用‘栈’的思想编写一个十进制转换二进制、八进制或十六进制的程序
根据进制转换方法,如十进制向二进制转换,将转换的十进制整数除以二进制基数(2),得到余数和商,如果商不为0,该商继续做被除数,除以基数,得到余数和商,此过程一直进行,直到得到的商为0时停止,此时得到的所有余数逆序排列就是转换得到的二进制数。十进制转换其他进制(八、十六)方法和当前方法相同,故可以扩展得到十进制向二、八、十六进制转换的统一算法。由于十进制数转换其他进制数时符合栈的特点“先进后出”,即先得到的余数是低位,后得到的余数是高位,因此这里利用栈做工具,保存转换过程中得到的余数。这里的栈需要自己定义,可以定义顺序栈,也可以定义链栈。可以将栈的定义及其基本操作放在一个头文件中,如果哪个程序需要就可以包含该头文件,而不需要每次都重新编写栈的代码。
首先运用顺序栈
头文件<shujujiegou_shunxuzhan.h>
代码语言:javascript复制#include <stdlib.h>#define MAX 100typedef int SElemType;
typedef struct{ SElemType base[MAX]; // 栈底指针 int top; // 栈顶指针 //当前已分配的存储空间,以元素为单位。}SqStack;bool InitStack( SqStack &s ){ // 初始化顺序栈, 构造一个空栈 s.top =-1; return true;}// InitStackbool Push(SqStack &s,SElemType e){ //把元素e入栈 if( s.top ==MAX-1) // 若栈满,返回false return false; s.top ; s.base[s.top]= e; return true; }// Pushbool Pop( SqStack &s, SElemType &e ){ // 出栈 if( s.top == -1) // 空吗? return false; e = s.base[s.top]; s.top --; return true;}// Popbool StackEmpty(SqStack s){ //判栈空 return(s.top==-1);}
主程序
代码语言:javascript复制#include <stdio.h>#include"shujujiegou_shunxuzhan.h"void conversion (int N,int B) { SqStack S; int temp,x; InitStack(S); // 构造空栈 while (N) { temp=N%B; Push(S,temp); N=N/B; } while (!StackEmpty(S)) { Pop(S,x); switch(x) { case 10:putchar('A');break; case 11:putchar('B');break; case 12:putchar('C');break; case 13:putchar('D');break; case 14:putchar('E');break; case 15:putchar('F');break; default :printf("%d",x);//x<=9时原样输出 } } printf("n");} // conversionint main(){ int m,n; printf("这是一个十进制数转化为二进制数、八进制数及十六进制数的演示程序……n"); printf("请输入十进制数:"); scanf("%d",&m); printf("n"); printf("请输入你想将十进制转换成的进制:"); scanf("%d",&n); printf("十进制的%d转换成%d进制的数是:",m,n); conversion(m,n); printf("n"); return 0;}
链栈
头文件<shujujiegou_lianzhan.h>
代码语言:javascript复制#include <stdlib.h>typedef char ElemType ;typedef struct linknode{ ElemType data; struct linknode *next; }LiStack; void InitStack(LiStack * &s);//构造空栈 void DestoryStack(LiStack * &s);//销毁栈 bool StackEmpty(LiStack * s);//判栈空 void Push(LiStack * &s, ElemType e);//压栈 bool Pop(LiStack * &s, ElemType &e);//出栈 bool GetTop(LiStack * s, ElemType &e);//取栈顶元素 void InitStack(LiStack * &s){ s = (LiStack * )malloc(sizeof(LiStack)); s -> next = NULL; } void DestoryStack(LiStack * &s){ LiStack * p = s, *q = s -> next; while(q != NULL) { free(p); p = q; q = p -> next; } } bool StackEmpty(LiStack * s){ return (s -> next == NULL);}void Push(LiStack * &s, ElemType e){ LiStack * p; p = (LiStack *)malloc(sizeof(LiStack)); p -> data = e; p -> next = s -> next; s -> next = p;}bool Pop(LiStack * &s, ElemType &e){ LiStack * p; if(s -> next == NULL) return false; p = s -> next; e = p -> data; s -> next = p -> next; free(p); return true;}bool GetTop(LiStack * s, ElemType &e){ if(s -> next == NULL) return false; e = s -> next -> data; return true;}
程序代码
代码语言:javascript复制#include<stdio.h>#include<stdlib.h>#include"shujujiegou_lianzhan.h"void trans(int a,int b){ LiStack * s; InitStack(s); int yu; ElemType e; while(a) { yu = a % b; if(yu >= 10) { ElemType p = yu 'A' - 10;//转换为对应字符的ASCII值 Push(s, p); } else { ElemType p = yu '0';//转换为对应数字字符的ASCII值 Push(s, p); } a /= b; } while(!StackEmpty(s)) { Pop(s, e); printf("%c", e); } printf("n"); DestoryStack(s);}int main(){ int n; while(1) { printf("————十进制向二进制、八进制、十六进制转换器—————nn"); printf("请输入一个十进制数(要求大于或等于零,其他则退出!):"); scanf("%d", &n); if(n<0) break; printf("十进制数%d转换为二进制数为:",n); trans(n,2); printf("十进制数%d转换为八进制数为:",n); trans(n,8); printf("十进制数%d转换为十六进制数为:",n); trans(n,16); system("pause");//暂停作用,包含在stdlib.h中 system("cls");//清屏作用,包含在stdlib.h中 } return 0;}
运行结果图