来源:互联网 发布:淘宝网婚礼妈妈装冬装 编辑:程序博客网 时间: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 ;}