【数据结构第二周】堆栈知识点整理
堆栈(Stack):具有一定操作约束的线性表
只在一端(栈顶,Top)做插入和删除
1、栈的顺序存储实现
栈的顺序存储结构通常由一个一维数组和一个记录栈顶元素位置的变量组成。
(1)存储
1 2 3 4 5 6 | #define MaxSize <储存数据元素的最大个数> typedef struct { ElementType Data[MaxSize] int Top; }Stack; |
(2)入栈
1 2 3 4 5 6 7 8 9 10 11 12 | void Push(Stack *PtrS, ElementType item) { if (PtrS->Top == MaxSize-1) { printf ( "堆栈满" ); return ; } else { PtrS->Data[++(PtrS->Top)] = item; return ; } } |
(3)出栈
1 2 3 4 5 6 7 8 9 10 11 | ElementType Pop(Stack *PtrS) { if (PtrS->Top == -1) { printf ( "堆栈空" ); return ERROR; } else { return (PtrS->Data[(PtrS->Top)--]); } } |
2、堆栈的链式存储实现
栈的链式存储结构实际上就是一个单链表,叫做链栈。
插入和删除操作只能在栈链的栈顶进行
栈顶指针Top应该指向链表的头结点
(1)初始化
1 2 3 4 5 6 | typedef struct Node { ElementType Data; struct Node *Next; } LinkStack; LinkStack *Top; |
1 2 3 4 5 6 7 8 9 10 11 | LinkStack *CreateStack() { /* 构建一个堆栈的头结点,返回指针 */ LinkStack *S; S = malloc ( sizeof ( struct Node )); S->Next = NULL; return S; } int IsEmpty( LinkStack *S ) { /*判断堆栈S是否为空,若为空函数返回整数 1,否则返回0 */ return ( S->Next == NULL ); } |
(2)入栈
1 2 3 4 5 6 7 8 | void Push( ElementType item, LinkStack *S ) { /* 将元素item压入堆栈S */ struct Node *TmpCell; TmpCell = malloc ( sizeof ( struct Node ) ); TmpCell->Element = item; TmpCell->Next = S->Next; S->Next = TmpCell; } |
(3)出栈
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | ElementType Pop( LinkStack *S ) { /* 删除并返回堆栈S的栈顶元素 */ struct Node *FirstCell; ElementType TopElem; if ( IsEmpty( S ) ) { printf (“堆栈空”); return NULL; } else { FirstCell = S->Next; S->Next = FirstCell->Next; TopElem = FirstCell ->Element; free (FirstCell); return TopElem; } } |
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步