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

栈的应用

用于表达式的计算

相关推荐
2301_764441336 小时前
LISA时空跃迁分析,地理时空分析
数据结构·python·算法
玉树临风ives7 小时前
atcoder ABC 452 题解
数据结构·算法
无敌昊哥战神9 小时前
深入理解 C 语言:巧妙利用“0地址”手写 offsetof 宏与内存对齐机制
c语言·数据结构·算法
XH华10 小时前
数据结构第九章:树的学习(下)
数据结构·学习
会编程的土豆11 小时前
【数据结构与算法】再次全面了解LCS底层
开发语言·数据结构·c++·算法
汀、人工智能13 小时前
[特殊字符] 第93课:太平洋大西洋水流问题
数据结构·算法·数据库架构·图论·bfs·太平洋大西洋水流问题
feng_you_ying_li14 小时前
C++11,{}的初始化情况与左右值及其引用
开发语言·数据结构·c++
锅挤15 小时前
数据结构复习(第一章):绪论
数据结构·算法
汀、人工智能15 小时前
[特殊字符] 第95课:冗余连接
数据结构·算法·链表·数据库架构··冗余连接