利用栈将任意非负十进制数转换成十六进制

利用栈将任意非负十进制数转换成十六进制

var
 x:longint;
 z:array[1..100] of byte;
 top:byte;
 y,modd:byte;

procedure push;
begin
 inc(top); z[top]:=modd;
end;

procedure pop;
begin
 if top>0 then begin y:=z[top]; dec(top); end
 else writeln('stack overflow !');
end;

begin
 x:=1234567890;
 top:=0;
 repeat
  modd:=x mod 16;
  x:=x div 16;
  push;
 until x=0;
 
 while top>0 do begin
  pop;
  if (y>=10) then write(chr(y-10+ord('A')):1)
  else write(chr(y+ord('0')):1);
 end;
end.

温馨提示:内容为网友见解,仅供参考
第1个回答  2016-04-11
主要思想:

1)由于在C语言中没有对十六进制类型的变量,所以输入的十六进制数应如何处理以确保存储在内存中仍保持十六进制?
基于这一原因,只能以字符串的形式来存储输入的十六进制数,即把数作为字符存入内存。
2)为了实现转换,将输入的一串字符一个一个地入栈,用栈的好处是什么?
好处是:不用判断输入的这个十六进制数是几位数,而且栈顶就是个位数字(当然也很容易判断是几位数:字符串的长度就是十六进制数的位数);
3)算法实现:设转换后的十进制为Dec(初值为0)、设i=0(且i<字符串的长度,这个长度不是额外求的,而是在入栈的同时计算来的);将栈中的字符一个一个出栈,每出栈一个字符c就判断它是(‘0’~‘9’)、还是(‘A’~‘F’)或是(‘a’~‘f’):
①若c是(‘0’~‘9’),则转换时按下述原则进行:Dec=Dec+(c-48)*16n;
②若c是(‘A’~‘F’),则转换时按下述原则进行:
若c=’A’,则Dec=Dec+10*16n;
若c=’B’,则Dec=Dec+11*16n;
若c=’C’,则Dec=Dec+12*16n;
若c=’D’,则Dec=Dec+13*16n;
若c=’E’,则Dec=Dec+14*16n;
若c=’F’,则Dec=Dec+15*16n;
说明:不这样做也可以,用一个表达式表示上面的6个式子,如下:
    Dec=Dec+((c-65)+10)*16n;
③若c是(‘a’~‘f’),则转换时按下述原则进行:
若c=’a’,则dec=dec+10*16n;
若c=’b’,则dec=dec+11*16n;
若c=’c’,则dec=dec+12*16n;
若c=’d’,则dec=dec+13*16n;
若c=’e’,则dec=dec+14*16n;
若c=’f’,则dec=dec+15*16n;
说明:不这样做也可以,用一个表达式表示上面的6个式子,如下:
    dec=dec+((c-97)+10)*16n;
#include "stdio.h"
#include "math.h"
typedef char datatype; /*定义栈的数据结构*/
typedef struct
{datatype data[100];
int top;
}SQstack;
void push(SQstack *s,datatype e) /*入栈操作*/
{(*s).top++;
(*s).data[(*s).top]=e;
}
datatype pop(SQstack *s,datatype *e) /*出栈操作*/
{*e=(*s).data[(*s).top];
(*s).top--;
return (*e);}
void initstack(SQstack *s)  /*建空栈*/
{(*s).top=-1;
}
int emptystack(SQstack s)  /*判断栈是否为空*/
{if(s.top==-1) return 1;
else return 0;
}
datatype gettop(SQstack s)  /*取栈顶元素、并返回*/
{if(emptystack(s)) return NULL;
else return s.data[s.top];
}
trans16_10()      /*输入十六进制数、入栈、出栈并判断转换*/
{SQstack *s;
char e,ch[100],c;
int i=0,j;
double Dec=0,x;
clrscr();
initstack(s);
ch=getchar();       /*输入的十六进制数用ch接收*/
while(ch!='#')  /*入栈、i表示字符串的长度、以’#’为结束输入标志*/
{push(s,ch);
i++;
ch=getchar();}
j=0;
while(j<i) /*出栈并判断转换*/
{c=pop(s,&e);   /*注意:这里必须使用中间变量c,因下面程序的每个if的条件部分要两次用到同一个栈顶c*/
if(c>='0' && c<='9')
Dec+=(c-48)*pow(16,j);
else if(c>='a' && c<='f')
switch(c)
{case 'a':Dec+=10*pow(16,j);break;
case 'b':Dec+=11*pow(16,j);break;
case 'c':Dec+=12*pow(16,j);break;
case 'd':Dec+=13*pow(16,j);break;
case 'e':Dec+=14*pow(16,j);break;
case 'f':Dec+=15*pow(16,j);break;
}
else if(c>='A' && c<='F')
switch(c)
{case 'A':Dec+=10*pow(16,j);break;
case 'B':Dec+=11*pow(16,j);break;
case 'C':Dec+=12*pow(16,j);break;
case 'D':Dec+=13*pow(16,j);break;
case 'E':Dec+=14*pow(16,j);break;
case 'F':Dec+=15*pow(16,j);break;
}
j++;
}
return Dec;
}
void main()
{ double Dec;   Dec=trans16_10();
printf("\n%.0lf",Dec); }

用栈实现,输入一个十进制数,转换成十六进制输出(C语言)
1、首先在桌面上,点击“Microsoft Visual Studio 2010”图标。2、然后在该界面中,先定义栈最大的存储空间。2、其次在该界面中,编写初始化空栈函数代码。3、之后在该界面中,编写判断空栈函数代码。4、接着在该界面中,编写判断栈满函数代码。5、其次在该界面中,编写进栈、出栈函数代码。6、接着...

利用栈的基本操作,设计一个算法将一个十进制整数转换成十六进制输出
void Push(SNode*& HS, const ElemType& item){ SNode* newptr = new SNode; \/* 获取动态结点*\/ newptr->data = item; \/*给新分配的结点赋值*\/ newptr->next = HS; \/* 向栈顶压入新结点*\/ HS = newptr;} \/\/从栈中删除一个元素并返回该元素 ElemType Pop(SNode*& HS){...

用C++链栈编辑十进制对十六进制的转化
printf("请输入你要转换的数字:"); scanf("%d",&num); top=(LinkStack*)malloc(sizeof(LinkStack)); IniStack(top); while(num!=0)

(利用栈实现)输入一个十进制正整数,输出其八进制数和十六进制数
int top;}SeqStack;SeqStack *initSeqStack() 栈初始化 { SeqStack *s;s=(SeqStack*)malloc(sizeof(SeqStack));s->top=-1;return s;} int empty(SeqStack *s) 判栈空 { if(s->top==-1)return 1;else return 0;} int push(SeqStack *s,DataType x)入栈 { if(s->top==MAXSIZE-1...

利用堆栈,设计算法将一个十进制正整数转换为十六进制数输出。(先设计存...
1、x 不为零继续,为零则跳出。2、每次将x 余16 的结果入栈(实际上是将x 的16 进制的第i 位入栈,i 表示循环次数)。函数式程序设计语言中,不同子函数的参数的种类和个数是不相同的,编译器也是使用堆栈来存储子程序的参数。递归能够增强语言的表达能力和降低程序设计难度。递归程序的递归深度...

利用栈的基本操作实现将任意一个十进制整数转化为R进制整数吗?
让十进制数(number)除以要转换的进制R 若结果不为0,则继续执行前述操作,直到得到除的结果为零,此时number除以R取其余数,将其结果(number Mod R)映射到指定的输出字符数组中下标输出即为结果(描述的不是很好,你看代码吧)\\x0d\\x0a\/\/用这种方法也比较可以\\x0d\\x0a#include\\x0d\\x0avoid ten_to_any(...

栈和队列 - 栈和队列的应用实例 - 栈的应用实例(一)
转换算法如下 typedef int DataType;\/\/应将顺序栈的DataType定义改为整型 void MultiBaseOutput (int N int B){\/\/假设N是非负的十进制整数 输出等值的B进制数 int i;SeqStack S;InitStack(&S);while(N){ \/\/从右向左产生B进制的各位数字 并将其进栈 push(&S N%B); \/\/将bi进栈 <=i<=...

数据结构中用C语言写:利用栈实现十进制数 N和其它 d进制数的转换。
6、然后在该界面中,输入进制转换代码“void systemConvert(int number,int system,SqStack *SS){ int q;\/\/商 int r;\/\/余数 r = number\/system; q = number%system; PushStack(SS,q); \/\/int i = 0; while(r!=0) { q = r%system; r = r\/system; PushStack(SS,q); }}”...

...并利用顺序栈实现将一个非负的十进制数N转换成另一个等价的二进制...
int fun(SqStack *s,int num, int k) \/\/可将十进制转换成2-9进制 { static int count = 0;int n;if(num < k){ Push(s, num+48);return count;} n = num % k;Push(s, n+48);fun(s,num\/k, k);} int main(){ SqStack *t,*e;InitStack(t);InitStack(e);fun(t, 4,...

...一个栈,将十进制转换成二进制、八进制或十六进制。
String result = "";Stack<Integer> remStack = new Stack<Integer>();while(decNumber > 0){ int rem = decNumber % base;remStack.push(rem);decNumber = decNumber\/base;} while(!remStack.isEmpty()){ result = result+digits[remStack.pop()];} return result;} 这个可以任意转换,...

相似回答