您的位置:首页 > 理论基础 > 数据结构算法

栈在数制转换上的应用

2016-08-05 16:09 781 查看
栈的应用有很多,其中它可以被应用于数制转换,其算法原理如下:

十进制数N和其他n进制数的转换,如果用栈来实现,那将会非常简单。其中一个简单的算法可以基于如下数学原理

N=(N div n)×n+N mod n(其中:div为整除运算,mod为求余运算,N为非负十进制整数)

举个例子,例如,十进制的1348,转换成八进制后其值应为2504

NN div 8N mod 8
13481684
168210
2125
202
由于上述计算过程是从低位到高位顺序产生八进制数的各个数位,而打印输出,一般来说应该从高位到低位进行,恰好和计算过程相反。因此,若将计算过程中得到的八进制数的各位顺序进栈,然后按出栈序列打印输出,所得到的数值就是与输入对应的八进制数。

编译软件:VC++6.0 

测试用例结果截图如下:



源代码如下:

/**********************************
栈的数制转换运用和实现(十进制数N转换成其他n进制数。完整代码,C实现)
Author:大地在我腳下
Date:2016-7-29
Email:jsrcdjcyy@163.com
**********************************/
#include <stdio.h>
#include <stdlib.h>

typedef struct Node
{int data;
struct Node* next;
}Node,*NStack;

typedef struct LNode
{NStack Top;
NStack Bottom;
}LNode,*LStack;

LStack InitStack();
void conversion(LStack,int,int);
void Push(LStack,int);
void Pop(LStack,int*);
bool Empty(LStack);

void main()
{int N,n;
LStack pStack=InitStack();
printf("Please input the number and its radix:");
scanf("%d%d",&N,&n);//十进制数N转换成其他n进制数

4000
printf("\n");
printf("Now the %d radix is:",n);
conversion(pStack,N,n);
}

LStack InitStack()
{NStack p=(NStack)malloc(sizeof(Node));
LStack q=(LStack)malloc(sizeof(LNode));
if(!p||!q)
{printf("Malloc failed!");
exit(-1);
}
q->Top=q->Bottom=p;
p->data=0;
q->Bottom->next=NULL;
return q;
}

void conversion(LStack S,int N,int n)
{int d;
while(N)
{Push(S,N%n);
N=N/n;
}
while(!Empty(S))
{ Pop(S,&d);
printf("%d",d);
}
printf("\n");
}

void Push(LStack S,int e)
{NStack p=(NStack)malloc(sizeof(Node));
if(!p)
{printf("Malloc failed!");
exit(-1);
}
p->data=e;
p->next=S->Top;
S->Top=p;
}

void Pop(LStack S,int* e)
{NStack q,p=S->Top;
q=p->next;
*e=p->data;
free(p);
S->Top=q;
}

bool Empty(LStack S)
{if(S->Top->next) return false;
else return true;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息