案例分析
将一个十进制数N转换为8进制数时,在计算过程中,把N与8求余得到的八进制数的各位一次进栈,计算完毕后将栈中的八进制数的各位一次出栈输出,输出结果就是带球的八进制数。
案例实现
在具体实现时,站可以采用顺序存储并表示也可采用i链式存储表示。
算法步骤
1、初始化一个空栈S
2、当十进制数N非零时,循环执行以下操作:
①把N与8求余得到的八进制数压入栈S
②N更新为N与8的商
3、当栈s非空时,循环执行以下操作:
①弹出栈顶元素
②输出e
算法思想
十进制数N转换为D进制数
N = ( N d i v D ) ∗ D + N m o d D N = (N div D) *D + N mod D N=(NdivD)∗D+NmodD (其中,div为整除运算,mod为求与运算)
算法描述
//采用顺序栈实现数制转换(八进制)
void conversion (int n) {
InitStack (N); //初始化空栈S
while (N) {
Push(S,N%8); //把N与8求余得到的八进制数压入栈S
N=N/8; //N更新为N与8的商
}
while (!StackEmpty(s)) {
Pop(S.e); //弹出栈顶元素
cout<<e<<endl; //输出e
}
}
算法分析
算法的时间复杂度为O( l o g 8 n log_8n log8n)。
宅这个例子中,栈的操是单调的,即先一昧地入栈,然后一昧的出栈。上述问题用数组也可以实现,但是就顺序栈而言,简化了程序设计的问题,划分了不同的关注层次,使思考范围缩小了。而数组不仅掩盖了事情的本质,还要分散精力取考虑数组下标增减等细节问题。