数据结构_使用栈和循环实现 n! 递归算法
Stack.h
#pragma once
#include "预定义.h"
#include <iostream>
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
template<class SElemType>
struct SqStack
{
SElemType* base, * top;
int stacksize;
};
template<class SElemType>
Status InitStack(SqStack<SElemType> &S)
{
S.base = (SElemType*) malloc(STACK_INIT_SIZE * sizeof(SElemType));
if (!S.base)
exit(OVERFLOW);
S.top = S.base;
S.stacksize = STACK_INIT_SIZE;
return OK;
}
template<class SElemType>
Status DestroyStack(SqStack<SElemType> &S)
{
if (!S.base)
return ERROR;
free(S.base);
S.base = S.top = NULL;
S.stacksize = 0;
return OK;
}
template<class SElemType>
Status StackEmpty(SqStack<SElemType> S)
{
if (S.top == S.base)
return TRUE;
return FALSE;
}
template<class SElemType>
Status GetTop(SqStack<SElemType> S, SElemType &e)
{
if (S.top == S.base) return ERROR;
e = *(S.top - 1);
return OK;
}
template<class SElemType>
Status Push(SqStack<SElemType> &S, SElemType e)
{
if (S.top - S.base >= S.stacksize)
{
S.base = (SElemType*) realloc(S.base,
(S.stacksize + STACKINCREMENT) * sizeof(SElemType));
if (!S.base)
exit(OVERFLOW);
S.top = S.base + S.stacksize;
S.stacksize += STACKINCREMENT;
}
*S.top++ = e;
return OK;
}
template<class SElemType>
Status Pop(SqStack<SElemType> &S, SElemType &e)
{
if (S.top == S.base)
return ERROR;
e = *--S.top;
return OK;
}
主函数
typedef int SElemType;
int fact(int n)
{
int f;
SqStack<SElemType> S{};
InitStack(S);
while (n)
Push(S, n--);
f = 1;
while (!StackEmpty(S))
{
Pop(S, n);
f = n * f;
}
return f;
}