myStack.h
//myStack.h
// abstract data type for stack
template <class T> // 栈的元素类型为 T
class Stack {
public: // 栈的运算集
void clear(); // 变为空栈
bool push(const T item); // item入栈,成功则返回真,否则返回假
bool pop(T* item); // 返回栈顶内容并弹出,成功返回真,否则返回假,
bool getTop(T* item); // 返回栈顶内容但不弹出成功返回真,否则返回假,
bool isEmpty(); // 若栈已空返回真
bool isFull(); // 若栈已满返回真
};
arrStack.h
//arrStack.h
// array-based stack: definition and implementation for some methods
#include <iostream>
#include "myStack.h"
using namespace std;
template <class T>
class arrStack : public Stack<T> {
private: // 栈的顺序存储
int mSize; // 栈中最多可存放的元素个数
T *st; // 存放栈元素的数组
int top; // 栈顶位置,应小于mSize
public: // 栈的运算的顺序实现
arrStack(int size); // 创建一个给定长度(size)的顺序栈的实例
arrStack(); // 创建一个顺序栈的实例
~arrStack(); // 析构函数
void clear(); // 清空栈内容
bool push(const T item); // 入栈操作的顺序实现
bool pop(T* item); // 出栈的顺序实现
bool getTop(T* item); // 返回栈顶内容,但不弹出
bool isEmpty(); // 判断栈是否为空
bool isFull(); // 判断栈是否为满
};
template<class T>
arrStack<T>::arrStack(int size)
{
mSize=size;
top=-1;
st=new T[mSize];
}
template<class T>
arrStack<T>::arrStack()
{
top=-1;
}
template<class T>
arrStack<T>::~arrStack()
{
delete[] st;
}
template<class T>
void arrStack<T>::clear() // 清空栈内容
{
top=-1;
}
template<class T>
bool arrStack<T>::push(const T item) // 入栈操作的顺序实现
{
if(top==mSize-1)
{
cout<<"栈满溢出"<<endl;
return false;
}
else
{
st[++top]=item;
return true;
}
}
template<class T>
bool arrStack<T>::pop(T * item) // 出栈的顺序实现
{
if(top==-1)
{
cout<<"栈为空,不能执行出栈操作"<<endl;
return false;
}
else
{
*item=st[top--];
return true;
}
}
template<class T>
bool arrStack<T>::getTop(T * item) // 返回栈顶内容,但不弹出
{
if(top==-1)
{
cout<<"栈为空,不能读取栈顶元素"<<endl;
return false;
}
else
{
*item=st[top];
return true;
}
}
main.cpp
//main.cpp
#include <cstdlib>
#include <iostream>
#include "arrStack.h"
using namespace std;
long factorial(long n);
int main(int argc, char *argv[])
{
int n;
long result;
cout<<"请输入n的值:"<<endl;
cin>>n;
result=factorial(n);
cout<<n<<"的阶乘为:"<<result<<endl;
return 0;
}
// 求阶乘,用顺序栈实现
long factorial(long n) {
long num;
long result=1;
arrStack<long> arr(n);
while(n>0)
{
arr.push(n--);
}
while(arr.pop(&num))
{
result*=num;
}
return result;
}