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

栈的应用

用于表达式的计算

相关推荐
啊阿狸不会拉杆34 分钟前
《数字信号处理 》第 7 章-无限长单位冲激响应 (IIR) 数字滤波器设计方法
数据结构·算法·信号处理·数字信号处理·dsp
挽天java1 小时前
数据结构习题--寻找旋转排序数组中的最小值
数据结构·算法·排序算法
sin_hielo2 小时前
leetcode 1984
数据结构·算法·leetcode
定偶3 小时前
网络编程总结
开发语言·网络·数据结构·网络编程
橘颂TA3 小时前
【剑斩OFFER】算法的暴力美学——力扣 1020 题:飞地的数量
数据结构·c++·算法·leetcode·职场和发展·结构与算法
探序基因3 小时前
查看bam文件指定位点的基因测序情况计算基因型
数据结构·学习方法
奶茶树4 小时前
【数据结构进阶】AVL树(详解)
数据结构·c++
放荡不羁的野指针4 小时前
leetcode150题-双指针
数据结构·算法·leetcode
好学且牛逼的马4 小时前
【Hot100|15-LeetCode 238. 除自身以外数组的乘积】
数据结构·算法·leetcode