借助Vector实现栈,栈顶是向量末尾,栈底是向量起始:
#include "../Vector/Vector.h" //以向量为基类,派生出栈模板类
template <typename T> class Stack: public Vector<T> { //将向量的首/末端作为栈底/顶
public: //size()、empty()以及其它开放接口,均可直接沿用
void push(T const& e) { insert(size(), e); } //入栈:等效于将新元素作为向量的末元素插入
T pop() { return remove(size() - 1); } //出栈:等效于删除向量的末元素
T& top() { return (*this)[size() - 1]; } //取顶:直接返回向量的末元素
};
十进制到base进制的转换:
void convert(Stack<char>& S, __int64 n, int base) { //十进制数n到base进制的转换(迭代版)
static char digit[] //0 < n, 1 < base <= 16,新进制下的数位符号,可视base取值范围适当扩充
= { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };
while (n > 0) { //由低到高,逐一计算出新进制下的各数位
int remainder = (int) (n % base); S.push(digit[remainder]); //余数(当前位)入栈
/*DSA*/printf("%20I64d =", n);
n /= base; //n更新为其对base的除商
/*DSA*/printf("%20I64d * %d + %d\n", n, base, remainder);
/*DSA*/print(S); getchar();
}
} //新进制下由高到低的各数位,自顶而下保存于栈S中