藉助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中