数据结构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;
    }
}

栈的应用

用于表达式的计算

相关推荐
tachibana214 小时前
hot100 回文链表(234)
java·网络·数据结构·leetcode·链表
aaaameliaaa14 小时前
进制练习题【找出只出现一次的数字、交换两个变量(不创建临时变量)、统计二进制中1的个数、打印整数二进制的奇数位和偶数位、求两个数二进制中不同位的个数】
c语言·数据结构·笔记·算法
-dzk-14 小时前
【系统架构设计师】案例分析篇
开发语言·数据结构·python·算法·架构·系统架构·架构设计
东华万里17 小时前
第30篇 代码习惯 初学C与数据结构有感
c语言·数据结构·大学生专区
星空露珠18 小时前
迷你世界UGc3.0脚本Wiki[剧情动画模块管理接口 Timeline]
开发语言·数据结构·算法·游戏·lua
jinyishu_18 小时前
常见排序算法详解
数据结构·算法·排序算法
东华万里19 小时前
第31篇 数据结构入门:顺序表
数据结构·大学生专区
Vect__20 小时前
Go 数据结构 slice 深度剖析
开发语言·数据结构·golang
青山木20 小时前
Hot 100 --- LRU 缓存
java·数据结构·算法·leetcode·链表·缓存·哈希
剑挑星河月1 天前
35.搜索插入位置
java·数据结构·算法·leetcode