【案例分析】
当将一个十进制整数N转换为八进制数时,在计算过程中,把N与8求余得到的八进制数的各位依次进栈,计算完毕后将栈中的八进制数依次出栈输出,输出结果就是待求得的八进制数
【案例实现】
在具体实现时,栈可以采用顺序存储表示也可以采用链式存储表示。
算法-----数制的转换
【算法步骤】
1、初始化一个空栈S。
2、当十进制数N非零时,循环执行以下操作:
把N与8求余得到的八进制数压入栈S;
N更新为N与8的商。
3、当栈S非空时,循环执行以下操作:
弹出栈顶元素e;
输出e。
【算法描述】
这里我们使用的是伪代码,只是为了便于理解
void conversion(int n)
{//对于任意一个非负十进制数,打印输出与其等值的八进制数
InitStack(S); //初始化栈
while(N) //当N非零时,循环
{
Push(S,N%8); //把N与8求余得到的八进制数压入栈S
N=N/8; //N更新为N与8的商
}
while(!StackEmpty(S)) //当栈为非空时,循环
{
Pop(S,e); //弹出栈顶元素e
cout<<e; //输出e
}
}
【算法分析】
显然,该算法的时间和空间的复杂度均为O(log8^n).
这是利用栈的后进先出特征的最简单的例子。在这个例子中,栈的操作是单调的,即先一味地入栈,然后一味地出栈。也许,有的读者会提出疑问:用数组直接实现不是更简单吗?但仔细分析上述算法不难看出,栈的引入简化了程序设计的问题,划分了不同的关注层次,使思考范围缩小了。而数组不仅掩盖了问题的本质,还要分散精力去思考数组下标增减等细节问题。