栈在数制转换上的应用
2016-08-05 16:09
781 查看
栈的应用有很多,其中它可以被应用于数制转换,其算法原理如下:
十进制数N和其他n进制数的转换,如果用栈来实现,那将会非常简单。其中一个简单的算法可以基于如下数学原理
N=(N div n)×n+N mod n(其中:div为整除运算,mod为求余运算,N为非负十进制整数)
举个例子,例如,十进制的1348,转换成八进制后其值应为2504
由于上述计算过程是从低位到高位顺序产生八进制数的各个数位,而打印输出,一般来说应该从高位到低位进行,恰好和计算过程相反。因此,若将计算过程中得到的八进制数的各位顺序进栈,然后按出栈序列打印输出,所得到的数值就是与输入对应的八进制数。
编译软件: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;
}
十进制数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进制数
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;
}
相关文章推荐
- 栈应用之一数制转换
- 栈的应用——数制转换
- 7、数据结构笔记之七栈的应用之数制转换
- 数据结构--栈的基本操作及应用(数制转换)
- 栈的应用举例:数制转换,表达式求值
- (1.2.2.1)栈和队列的应用:数制转换、括号匹配、后缀表达式求解,中缀表达式求解、双栈实现队列,min函数栈
- 数学趣题——应用递归实现数制转换
- 第三章:顺序栈及其应用之三---数制转换
- 每天一个小程序(5)——栈的应用数制转换
- 第三章:顺序栈及其应用之三---数制转换
- 数制转换-栈的应用(C++实现)
- 栈的应用举例——数制转换
- 栈的应用 (数制转换和括号匹配)
- 栈的应用—数制转换
- 栈的应用--数制转换(十进制数转换为二进制、八进制、十六进制)
- 【数据结构】栈的应用--数制转换(c++)
- 数据结构题典020:栈的应用——数制转换(ANSI C)
- 3.2栈的应用举例----数制转换、括号匹配及行编辑
- 栈的基本应用-数制转换-数据结构
- 栈和队列的应用——数制转换软件