?
来源:互联网 发布:淘宝网婚礼妈妈装冬装 编辑:程序博客网 时间:2024/06/10 22:22
#include <cstdlib>#include <iostream>using namespace std;long factorial(long n);// abstract data type for stack template <class T> // 栈的元素类型为 Tclass Stack { public: // 栈的运算集 void clear(); // 变为空栈 bool push(const T item); // item入栈,成功则返回真,否则返回假 bool pop(T* item);// 返回栈顶内容并弹出,成功返回真,否则返回假, bool getTop(T* item); // 返回栈顶内容但不弹出成功返回真,否则返回假, bool isEmpty(); // 若栈已空返回真 bool isFull(); // 若栈已满返回真};// array-based stack: definition and implementation for some methodstemplate <class T> class arrStack : public Stack<T> { private: // 栈的顺序存储intmSize;// 栈中最多可存放的元素个数T *st; // 存放栈元素的数组public: inttop;// 栈顶位置,应小于mSize public: // 栈的运算的顺序实现arrStack(int size){ // 创建一个顺序栈的实例mSize = size;top = -1;st = new T[mSize];}arrStack(){ top = -1; }~arrStack() {// 析构函数delete [] st;}void clear() {// 清空栈内容top = -1; }bool push(const T item) { // 入栈操作的顺序实现if (top == mSize-1) { // 栈已满 cout << "栈满溢出" << endl;return false;}else {// 新元素入栈并修改栈顶指针st[++top] = item;return true;}}bool pop(T* item) { // 出栈的顺序实现if (top == -1) { // 栈为空cout << "栈为空,不能出栈操作"<< endl; return false;}else {*item = st[top--]; // 返回栈顶元素并修改栈顶指针return true;}}bool getTop(T* item) { // 返回栈顶内容,但不弹出if (top == -1) { // 栈空cout << " 栈为空,不能出栈操作"<< endl; return false;}else { *item = st[top];return true;} } bool isEmpty() { return (top == -1); } bool isFull() { return (top == mSize-1); }};int main(int argc, char *argv[]){ long x, m;cin >> x; cout << "the factioral of " << x << "is " ;m = factorial(x);cout << m <<endl; cin >> x;}/* recurive versionlong factorial(long n) {if (n <= 0) return 1;return n * factorial(n-1);}// iterated version long factorial(long n) {long m = 1;long i ;if (n > 0)for ( i = 1; i <= n; i++ )m = m * i ;return m ;} */// nonrevursive with stacklong factorial(long n) { arrStack<long> s(20); long tmp; long m = 1; while (n > 0) // 不满足递归出口 s.push(n--);// 按递归规则把相应数据压栈 while (!s.isEmpty()) {// 递归出口满足,开始进行返回处理s.pop(&tmp);m *= tmp; } return m ;}