栈的应用举例 数制转换

栈的应用举例

数制转换

十进制数N和其他d进制数的转换是计算机实现计算的基本问题,其解决方法很多,其中一个简单算法基于下列原理:

N = (N div d)×d + N mod d

(其中:div 为整除运算,mod 为求余运算)

例如:(1348)10 = (2504)8 ,其运算过程如下:

N N div 8 N mod 8

1348 168 4

168 21 0

21 2 5

2 0 2

假设现要编制一个满足下列要求的程序:对于输入的任意一个非负十进制整数,打印输出与其等值的八进制数。由于上述计算过程是从低位到高位顺序产生八进制数的各个数位,而打印输出,一般来说应从高位到低位进行,恰好和计算过程相反。因此,若将计算过程中得到的八进制数的各位顺序进栈,则按出栈序列打印输出的即为与输入对应的八进制数。

void conversion () {

// 对于输入的任意一个非负十进制整数,打印输出

// 与其等值的八进制数

InitStack(S); // 构造空栈

scanf (“%d”,N);

while (N) {

Push(S, N % 8);

N = N/8;

}

while (!StackEmpty(S)) {

Pop(S,e);

printf ( “%d”, e );

}

} // conversion

这是利用栈的后进先出特性的最简单的例子。在这个例子中,栈操作的序列是直线式的,即先一味地入栈,然后一味地出栈。也许,有的读者会提出疑问:用数组直接实现不也很简单吗?仔细分析上述算法不难看出,栈的引入简化了程序设计的问题,划分了不同的关注层次,使思考范围缩小了。而用数组不仅掩盖了问题的本质,还要分散精力去考虑数组下标增减等细节问题。