IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 栈的创建·c语言版 -> 正文阅读

[数据结构与算法]栈的创建·c语言版

? ? ? 创建一个栈之前,我们需要先想好栈的特点以及栈如何去使用更加方便。栈可以用顺序表或者链表的方式来实现,我们考虑一下顺序表和链表在创建栈时分别会有什么优缺点。

链栈按需申请空间,不会造成空间浪费,需要存储一个指针消耗一定空间。

顺序栈无法按需申请空间,可能会造成空间浪费,但只需存储数据,并且空间连续,空间利用率高。

? ? ? 由于顺序栈和链栈的插入和删除操作时间复杂度都是O(1),所以如果所栈元素的数目会在使用过程中发生较大的改变,我们一般使用链栈,而倘如我们栈的元素数目是固定不变的,则最好采用顺序栈的方式来存储。?

? ? ? ? ?对于小白来说,顺序栈可能会更好理解,并且顺序表和链表各有优缺,所以在此使用顺序表建立栈。

? ? ? ? ? 首先需要考虑的是一个栈的结构体需要什么,我们需要栈顶的元素,所以用一个top变量记录,我们存储元素需要数组,记录数组大小需要一个size变量。

#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<stdbool.h>
typedef int STDataType;
typedef struct Stack
{
?? ?STDataType* a;
?? ?STDataType top;
?? ?STDataType capacity;
}ST;

? ? ? ?这样一个栈的结构体就建立好了。

一个栈的基本功能应该有这些:

void StackInit(ST* ps);
void StackDestory(ST* ps);
void Stackpush(ST* ps, STDataType);
void StackPop(ST* ps);
STDataType Stacktop(ST* ps);
int Stacksize(ST* ps);
bool StackEmpty(ST* ps);
初始化、销毁、插入、删除、返回栈顶元素、返回栈的大小、判断栈是否为空。

初始化:

void StackInit(ST* ps)
{
?? ?assert(ps);//结构体指针不为空
?? ?ps->a = NULL;
?? ?ps->top = 0;
?? ?ps->capacity = 0;
}


销毁:

void StackDestory(ST* ps)
{
?? ?assert(ps);
?? ?free(ps->a);
?? ?ps->capacity = 0;
?? ?ps->top = 0;
}


插入:

void Stackpush(ST* ps, STDataType x)
?
?? ?assert(ps);
?? ?if (ps->top == ps->capacity)//当栈顶的位置等于栈的大小时栈就满了需要扩容。
?? ?{
?? ??? ?int newCapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;
? ? ? ? //如果此时栈为空先申请四个空间,不为空申请两倍空间。
?? ??? ?STDataType* tmp = (ST*)realloc(ps->a, sizeof(STDataType)*newCapacity);
? ? ? ? //创建一个变量把申请的空间给他
?? ??? ?if (tmp == NULL)
?? ??? ?{
?? ??? ??? ?printf("realloc fail");
?? ??? ??? ?exit(-1);
?? ??? ?}
?? ??? ?ps->a = tmp;//把tmp空间给数组
?? ??? ?ps->capacity = newCapacity;
?? ?}
?? ?ps->a[ps->top] = x;
?? ?ps->top++;
}


删除:

void StackPop(ST* ps)
{
?? ?assert(ps);
?? ?assert(ps->top > 0);//栈顶位置必须大于0
?? ?ps->top--;
}


其他:

int Stacksize(ST* ps)
{
?? ?assert(ps);
?? ?return ps->top;
}
?
bool StackEmpty(ST* ps)
{
?? ?return ps->top<=0;
}
STDataType Stacktop(ST* ps)
{
?? ?return ps->a[ps->top];
}


这样就把一个栈和栈的功能创建完了。

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-11-09 19:49:07  更:2021-11-09 19:50:40 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 10:48:15-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码