在栈所擅长解决的典型为问题中,有一类具有以下共同特征:
- 虽有明确的算法,但其解却以线性序列的形式给出;
- 其次,无论是递归还是迭代实现,该序列都是依逆序计算输出的;
- 最后,输入和输出的规模不定,难以事先确定输出数据的容器大小。
因其特有的“先进后出”的特性及其在容量方面的自适应性,使用栈来解决这类问题可谓恰到好处。
1. 进制转换
考查如下问题:任给十进制整数
n
,将其转换为
比如 λ=8 时,有 12345(10)=30071(8)
一般地,设 n=(dm⋯d2d1d0)(λ)=dm×λm+⋯+d2×λ2+d1×λ1+d0×λ0
若记
ni=(dm⋯di+1di)(λ)
,则有:
di=ni%λni+1=ni/λ
3. 递归实现
void convert(stack<char>& S, int n, int base){
static char digit[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'};
if (n) {
S.push(digit[n % base]);
convert(S, n / base, base);
}
}
对字符的处理,也可以采用如下的形式:
void convert(stack<char>& S, int n, int base){
if (n){
S.push('0' + n % base);
convert(S, n/base, base);
}
}
4. 迭代实现
void convert(stack<int>& S, int n, int base){
while (n) {
S.push(n % base);
n /= base;
}
}