用栈实现阶乘

实验内容:

从键盘读入若干个整数,建一个链式栈,并完成下列操作:

(1)初始化栈;

(2)判栈为空;

(3)出栈;

(4)入栈。

 

实验步骤:

1)定义结构体及栈链数据域的最大值

#include <stdio.h>

#define MAX 30

typedef struct stack{

int next;

int data[20];

}Stack;

Stack t;

 

2)入栈

定义一个变量i,以及所输入要计算的n阶乘,在进行判断,如果输入的n比MAX大,则直接退出,不然执行下面的语句。写一个for循环,将1到n依次加1存入到栈中,最后再将输入的n输出到屏幕上。

int push(int i)

{

   int n;

   scanf("%d", &n);

   if(n > MAX)

    return;

   for(i=2; i<=n; ++i)

   {

   t.data[t.next++] = i;

   }

   printf("%d!=",n);

}

 

(3)出栈

 出栈时定义一个变量i,定义一个长整形变量l用作结果,作循环,t.next所指的指针大于0则将数据取出,执行数据域的相乘来得到结果。

   int pop(int i)

{

   long l = 1;

   while(t.next > 0)

   {

      l *= t.data[--t.next];

   }

   return l;

}

 

4)主函数

主函数用于栈链指针的初始化,以及应用入栈,出栈函数。

 void main()

{

int n;

long l = 1;

t.next = 0;

push(n);

printf("%d \n", pop(l));

}

 

(5)代码入下

#include <stdio.h>

#define MAX 30

 

typedef struct stack{

int next;

int data[20];

}Stack;

Stack t;

 

int push(int i)

{

   int n;

   scanf("%d", &n);

   if(n > MAX)

    return;

   for(i=2; i<=n; ++i)

   {

   t.data[t.next++] = i;

   }

   printf("%d!=",n);

}

 

int pop(int i)

{

   long l = 1;

   while(t.next > 0)

   {

      l *= t.data[--t.next];

   }

   return l;

}

void main()

{

int n;

long l = 1;

t.next = 0;

push(n);

printf("%d \n", pop(l));

}

 

 

实验结果:

n=3:

用栈实现阶乘

n=5:

用栈实现阶乘

 

注意事项:

(1)入栈时首先要判断该栈链是否有元素,是否所输入的个数大于最大值,如果超过则直接返回。

(2)定义所输入结果时要使用长整形,到5的阶乘就已经很大了。

 

实验问题及难点:

     本实验的难点主要包括栈链的先进后出的操作,需要在入栈时从1开始入,依次加一,入到n则停止入栈,出栈则在栈顶做运算,依次向下来实现堆栈的先进后出。

 

 

实验总结:   

      通过对用栈链的方式实现n的阶乘的编写,让我对栈链的操作更加熟悉,先定义栈链后在进行判断,然后进行入栈操作,入栈完成后要体现出先进后出的原则,所进行的操作要在栈顶执行。但是还是运用的不太熟练,会多编写几个栈的操作的算法,使自己掌握的更加牢固。