栈的定义
栈(stack)仅仅可以表尾插入和删除操作。即我们可以认为,栈是先进后出的。栈就是一种特殊的线性表,即它存在前驱后继关系。它特殊点在于,它限制了整个线性表的插入和删除位置,只能在栈顶进行。
函数名 | 功能 |
---|---|
InitStack(*S) | 建立一个空的栈S |
DestroyStack(*S) | 销毁一个栈S |
ClearStack(*S) | 清空栈 |
StackEmpty(S) | 如果栈是空的,返回ture |
GetTop(S,*e) | 若栈存在且非空,用e返回栈顶元素 |
StackLenth(S) | 返回S的元素个数 |
push(*S,e) | 在栈顶插入e |
Pop(*S,*e) | 删除栈顶的元素,用e返回 |
入栈和出栈
status push(Sqatack *S,SElemtype e)
{
if(S->top==MAXSIZE-1)
{
return error;
}
S->top++;
S->data[S->top]=e;
return ok;
}
status Pop(Sqatack *S,SElemtype e)
{
if(S->top==-1)
{
return error;
}
*e=S->data[S->top]
S->top--;
return ok;
}
栈的链式存储结构
栈的链式存储结构,简称为链栈
理解起来就是加入指针,把栈顶放在单链表的头部。
栈的作用
栈的引入简化了程序设计,划分了不同的关注层次。
栈有一个非常重要的应用:递归
为了说明,我们举一个实例:斐波那契数列
斐波那契数列:斐波那契数列(Fibonacci sequence),又称黄金分割数列、因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:1、1、2、3、5、8、13、21、34、……在数学上,斐波那契数列以如下被以递推的方法定义:F(1)=1,F(2)=1, F(n)=F(n - 1)+F(n - 2)(n ≥ 3,n ∈ N*)在现代物理、准晶体结构、化学等领域,斐波纳契数列都有直接的应用,为此,美国数学会从 1963 年起出版了以《斐波纳契数列季刊》为名的一份数学杂志,用于专门刊载这方面的研究成果。(摘自百度百科)
递归的定义:一个直接调用自己或通过一系列的调用语句间接地调用自己的函数,称为递归函数。
%%打印前40位斐波那契数列
int FBi(int i)
{
if(i<2) return i==0?0:1;
return FBi(i-1)+FBi(i-2);
}
int main()
{
int i;
for(int i=0;i<40;i++)
printf("%d",Fbi(i));
return 0;
}
我们可发现,用递归的方法比常规的迭代办法代码短且方便。