数据结构01——栈

数据结构

堆栈

堆栈的抽象数据类型描述

堆栈(Stack):具有一定操作约束的线性表

只在一端(栈顶,Top)做插入、删除

插入数据:入栈(Push)

删除数据:出栈(Pop)

后入先出:Last In First Out (LIFO)

栈的顺序存储实现

栈的顺序存储结构通常由一个一维数组和一个记录栈顶元素位置的变量组成。

c 复制代码
#define MaxSize <存储数据元素的最大个数>
typedef struct SNode *Stack;
struct SNode {
	ElementType Data [MaxSize];
	int Top;
};
入栈 Push
javascript 复制代码
void Push (Stack PtrS, ElementType item)
{
	if (PtrS->Top == MaxSize - 1){ //判断栈是否满了
		printf("堆栈满");
		return;
	}else{  //栈没满,先Top指针上移,再填充内容
		PtrS->Data[++(PtrS->Top)] = item;
		return;
	}
};
出栈 Pop
c 复制代码
ElementType Pop (Stack PtrS)
{
	if(Ptrs->Top == -1){ //判断堆栈有没有空
		printf("堆栈空");
		return ERROR; 
	}else
		return (PtrS->Data[(PtrS->Top)--]); //出栈,先取值,再减一
}

栈的链式存储结构

栈的链式存储结构实际上是一个单链表,叫做链栈。插入和删除操作只能在链栈的栈顶(Top指针指向链表的head头,不可以指向尾。指向尾的话,我们只能通过遍历进行删除尾结点操作)

栈结点
c 复制代码
typedef struct SNode *Stack;
struct SNode {
	ElementType Data;  //结点的实际内容
	struct SNode *Next;  //结点中的包含下一个结点地址的指针
};
栈创建
c 复制代码
Stack CreateStack()
{  /*构建一个堆栈的头节点,返回指针S*/
	Stack S;
	S=(Stack)malloc(sizeof(struct SNode));
	S->Next = NULL;
	return S;
}

int IsEmpty(Stack S) //判断栈是否为空
{
	return (S->Next == NULL);
}
入栈 Push

链栈的入栈,不用判断是否栈满。它会向内存中申请空间,没有固定大小。

c 复制代码
void Push(ElementType item, Stack S)
{
    /* 将元素 item 压入堆栈 S */
    struct SNode *TmpCell;

    TmpCell = (struct SNode *)malloc(sizeof(struct SNode));
    TmpCell->Element = item;
    TmpCell->Next = S->Next;
    S->Next = TmpCell;
}
出栈 Pop

出栈需要判断是否为空。

c 复制代码
ElementType Pop(Stack S)
{
    /* 删除并返回堆栈 S 的栈顶元素 */
    struct SNode *FirstCell;
    ElementType TopElem;

    if (IsEmpty(S)) {
        printf("堆栈空");
        return NULL;
    }
    else {
        FirstCell = S->Next;
        S->Next = FirstCell->Next;
        TopElem = FirstCell->Element;
        free(FirstCell);
        return TopElem;
    }
}

栈的应用

用于表达式的计算

相关推荐
hweiyu002 小时前
数据结构:有向无环图
数据结构
liu****2 小时前
10.排序
c语言·开发语言·数据结构·c++·算法·排序算法
利刃大大2 小时前
【JavaSE】十一、Stack && Queue && Deque && PriorityQueue && Map && Set
java·数据结构·优先级队列··哈希表·队列·集合类
fufu03112 小时前
Linux环境下的C语言编程(三十九)
c语言·数据结构·算法·链表
前端小L2 小时前
回溯算法专题(十):二维递归的完全体——暴力破解「解数独」
数据结构·算法
AI科技星3 小时前
姬无烦科幻与张祥前统一场论的完美融合
数据结构·人工智能·算法·机器学习·重构
TL滕3 小时前
从0开始学算法——第十四天(数组与搜索)
数据结构·笔记·学习·算法
好易学·数据结构5 小时前
可视化图解算法73:跳台阶(爬楼梯)
数据结构·算法·leetcode·动态规划·笔试
长安er5 小时前
LeetCode 98. 验证二叉搜索树 解题总结
java·数据结构·算法·leetcode·二叉树·力扣