栈的应用有很多,其中它可以被应用于数制转换,其算法原理如下:
十进制数N和其他n进制数的转换,如果用栈来实现,那将会非常简单。其中一个简单的算法可以基于如下数学原理
N=(N div n)×n+N mod n(其中:div为整除运算,mod为求余运算,N为非负十进制整数)
举个例子,例如,十进制的1348,转换成八进制后其值应为2504
N | N div 8 | N mod 8 |
1348 | 168 | 4 |
168 | 21 | 0 |
21 | 2 | 5 |
2 | 0 | 2 |
由于上述计算过程是从低位到高位顺序产生八进制数的各个数位,而打印输出,一般来说应该从高位到低位进行,恰好和计算过程相反。因此,若将计算过程中得到的八进制数的各位顺序进栈,然后按出栈序列打印输出,所得到的数值就是与输入对应的八进制数。
编译软件: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进制数
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;
}