堆栈是操做受限的线性表,只能在同一端插入与删除元素。
容许进行插入删除操做的一段称为栈顶,所以栈顶是动态变化的。另外一端被称为栈底。数组
根据存储结构不一样分为:顺序栈 与 链栈。函数
顺序栈是在物理内存的连续空间内存放从栈底到栈顶的全部数据元素,同时还附带一个top指针指向栈顶在顺序栈中的位置(top可表明数组下标)。设计
链栈在物理内存上是零散的不连续的空间,节点之间经过地址域相互保存。栈顶指针top就是编标的表头指针。(与单链表相似)
3d
栈的基本操做为入栈出栈:指针
#include "stdio.h" #define StackSize 50 #define StackElementType int typedef struct { StackElementType elem[StackSize]; int top; }SeqStack; void InitStack(SeqStack *S) { S->top = -1;} int Push(SeqStack *S,StackElementType x) { if(S->top==(StackSize-1)) return(0); //栈已满 S->top++; S->elem[S->top]=x; return(1); } int Pop(SeqStack *S,StackElementType *x) { // 将栈S的栈顶元素弹出,放到x所指的存储空间中 if(S->top==-1) return(0);//栈为空 else { *x=S->elem[S->top]; S->top--; // 修改栈顶指针 return(1); } } int GetTop(SeqStack *S, StackElementType *x) { // 读出栈顶元素赋值给x所指空间,但栈顶指针保持不变 if(S->top==-1) return(0); //栈为空 else { *x = S->elem[S->top]; //top不变 return(1); } } int IsEmpty(SeqStack *S) //也可SeqStack S { return(S->top==-1?1:0); } void main() { SeqStack T;int i,x; InitStack(&T); printf("输入入栈的数据(整数型,0结束):"); scanf("%d",&x); while(x!=0){ Push(&T,x) ; printf("输入入栈的数据(整数型,0结束):"); scanf("%d",&x); } Pop(&T,&x); printf("出栈的数据为:%d\n",x); Pop(&T,&x); printf("出栈的数据为:%d\n",x); }
堆栈能够在程序设计语言中实现递归调用。即函数直接或间接的调用自身。
为保证递给调用正确执行,系统设置“递归工做栈”做为递归调用的数据存储区。
每一层地柜包含 参数、局部变量、全局变量、上层返回的地址。每进入一层,产生新的工做记录压入栈顶,每退出一层就从栈顶弹出一个工做记录。
以n的阶乘为例:code
// 阶乘的递归运算 int f(int n) { if (n==0) { return 1; } else { return n*f(n-1); } }