堆栈
来源:互联网 发布:mac 图片转文字 编辑:程序博客网 时间:2024/06/01 23:28
堆栈
什么是堆栈
堆栈是具有一定操作约束的线性表,它只在一端(栈顶,Top)做插入和删除操作。对战具有后入先出的特点,即后进入堆栈的元素因为更靠近栈顶,所以在出栈(删除)操作中先行考虑这个元素。在计算机中,函数递归、表达式运算、输入数据缓冲区等很多地方都必须使用堆栈。
堆栈的顺序存储实现
定义节点
#define MAXSIZEtypedef strcut SNode *Stackstruct SNode{ ElemType Data[MAXSIZE]; int Top; //工作计数变量};
入栈
void Push(Stack PtrS, ElemType item){ if(PtrS -> Top == MAXSIZE -1) { printf("堆栈满\n"); return; } else { PtrS -> Data[++ (PtrS -> Top)] = item; return; }}
出栈
ElemType Pop(Stack PtrS){ if(PtrS -> Top == -1) { printf("堆栈空\n"); return NULL; } else return (PtrS -> Data[(PtrS -> Top) --]);}
实例:使用一个数组实现两个堆栈,要求最大地利用数组空间,使数组只要有空间,入栈操作就能成功
分析:将数组的两端作为两个堆栈的入口,可以实现数组空间的最大化利用,不会造成浪费。当两个栈顶指针相遇时,表示堆栈满了。
ElemType Data[MAXSIZE];struct DStack{ ElemType Data[MAXSIZE]; int Top1; int Top2;}void Push(struct DStack *PtrS, ElemType item, int Tag){ if(PtrS -> Top2 - PtrS -> Top1 == 1) { printf("堆栈满\n"); return; } if(Tag == 1) PtrS -> Data[++ (PtrS -> Top1)] = item; else PtrS -> Data[-- (PtrS -> Top2)] = item;}ElemType Pop(struct DStack *PtrS, int Tag){ if(Tag == 1) { if(PtrS -> Top1 == -1) { printf("堆栈1空\n"); return NULL; } else return (PtrS -> Data[(PtrS -> Top1) --]); } else { if(PtrS -> Top2 == MAXSIZE) { printf("堆栈2空\n"); return NULL; } else return (PtrS -> Data[-- (PtrS -> Top2)]) }}
堆栈的链式存储实现
定义节点
typedef struct SNode *Stack;struct SNode{ ElemType Data; struct SNode *Next;};
初始化(构建一个堆栈的头结点,返回指针。头结点没有任何元素,只是作为后续链表的入口)
Stack CreateStack(){ Stack S; S = (Stack)malloc(sizeof(struct SNode)); S -> Next - NULL; return S;}
判断堆栈是否为空
int IsEmpty(Stack S){ return (S -> Next == NULL); //若空返回1,不空返回0}
入栈
void Push(ElemType item, Stack S){ struct SNode *TmpCell; TmpCell = (sturct *)malloc(sizeof(struct SNode)); TmpCell -> Data = item; TmpCell -> Next = S -> Next; S -> Next = TmpCell;}
出栈
ElemType Pop(Stack S){ struct SNode *FirstCell; ElemType TopElem; if(IsEmpty(S)) { printf("堆栈空\n"); return NULL; } else { FirstCell = S -> Next; S -> Next = FirstCell -> Next; TopElem = FirstCell -> Next; free(FirstCell); return TopElem; }}
阅读全文
0 0