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

栈的应用

用于表达式的计算

相关推荐
黛色正浓3 分钟前
leetCode-热题100-普通数组合集(JavaScript)
java·数据结构·算法
辞砚技术录1 小时前
MySQL面试题——索引、B+树
数据结构·数据库·b树·面试
666HZ6661 小时前
数据结构1.0 数据结构在学什么
数据结构·算法
余瑜鱼鱼鱼1 小时前
Java数据结构:从入门到精通(五)
数据结构
空空潍1 小时前
hot100-滑动窗口最大值(day11)
数据结构·c++·算法·leetcode
R-G-B2 小时前
BM28 二叉树的最大深度
数据结构·算法·二叉树·bm28·二叉树的最大深度
菜鸟233号3 小时前
力扣416 分割等和子串 java实现
java·数据结构·算法·leetcode
求梦8203 小时前
【力扣hot100题】缺失的第一个正数(12)
数据结构·算法·leetcode
黎雁·泠崖3 小时前
二叉树实战进阶全攻略:从层序遍历到OJ题深度解析
c语言·数据结构·leetcode
散峰而望3 小时前
【算法竞赛】顺序表和vector
c语言·开发语言·数据结构·c++·人工智能·算法·github