栈在数制转换上的应用

栈的应用有很多,其中它可以被应用于数制转换,其算法原理如下:

十进制数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进制数
 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;
}


  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值