栈的应用
在进制转化过程中,其中10进制转化各种进制用处比较多。
原理就是拿十进制的数不停的 去除 进制的模数 得到余数组合就是转化后的数。
比如 (255)10 转化为 16进制 时候
254/16=15 ...14 ---> E
15/16=0...15 ---> F
255 即为 0XFE
注意到各个结果反过来才是最后的结果。想到栈的特点,这里可以用栈的结构,最先算出来的结果现存入到栈底,最后算出的在栈顶。
然后出栈就可以得到最后的结果。
这里我做一个10进制转16进制转化的程序。
添加之前写的栈的程序:
#include "stdafx.h" #include<stdlib.h> typedef struct stNode{ //栈的数据结构,一个数据和一个指针 int data; struct stNode *next; }stkNode,*pStkNode; typedef struct listst{ //链栈的栈顶结构,一个栈的指针结构和一个计数 pStkNode top; int count; }listTop; void prt_stack(listTop t) { int len = t.count; printf("len is %d\n",len); pStkNode pos = t.top; while (len > 0) { int x = pos->data; printf(" %d ",x); pos = pos->next; len--; } } void init_stack(pStkNode *ls,listTop *t) { *ls = (pStkNode)malloc(sizeof(stkNode)); (*ls)->data = 0; (*ls)->next = NULL; (*t).count = 0; (*t).top = (*ls); } void pushstack(int elem,listTop *t) { pStkNode n = (pStkNode)malloc(sizeof(stkNode)); //(a) n->data = elem; //(b) n->next = (*t).top; //(c) (*t).top = n; //(d) (*t).count = (*t).count +1; } void popstack(listTop *t) { pStkNode p = (*t).top; (*t).top = (*t).top->next; (*t).count = (*t).count - 1; free(p); }
先在主函数中定义链栈:
int main() { pStkNode list=NULL; listTop top; init_stack(&list,&top);//相当于 top和list绑定了 //... }
后面添加转化函数:
void convHex(int nn,listTop *top) { int mod; int di; while (nn) { di = nn/16; mod = nn%16; pushstack(mod,top); nn = di; } }
这里每次把余数存放到以top指向的链栈中。链栈中存放的是十进制的数,比如F是以15的形式存放在其中。还要在显示的时候将15转化为F。
下面这个函数就是将十进制字符转换为十六进制的字符:
char dispc(int x) { if (x < 10) { return x; } else { return 'A'+(x-10); } }
由于只需要打印出来,并不需要存放在硬盘上,所以只需要输出到控制台的屏幕上即可。这里将单个十进制字符转化为十六进制的字符即可。
void resHex(listTop t) { int len = t.count; pStkNode pos = t.top; printf("0x"); while (len > 0) { int x = pos->data; char cx=dispc(x); printf("%c",cx); pos = pos->next; len--; } printf("\n"); }
完整的主函数:
int _tmain(int argc, _TCHAR* argv[]) { int num; pStkNode list=NULL; listTop top; init_stack(&list,&top);//相当于 top和list绑定了 printf("this program is 10 to hex\n"); printf("please input a number:"); scanf("%d",&num); printf("you put the number is %d\n",num); getchar(); convHex(num,&top); // prt_stack(top); resHex(top); getchar(); return 0; }
运行之后: