数据结构—栈

devtools/2024/9/22 22:33:49/

概念

    :一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为顶,另一端称为底。中的数据元素遵守后进先出LIFO(Last In First Out)的原则。

的插入操作叫做进/压、入。入数据在顶。
的删除操作叫做出。出数据也在顶。

结构

   的实现一般可以使用数组或者链表实现,相对而言数组的结构实现更优一些。因为数组在尾上插入数据的代价比较小。

 的基本操作

定义的结构


//定义的结构
typedef int STDataType;
typedef struct Stack
{STDataType* arr;int capacity;     //的空间大小int top;          //顶
}ST;

的初始化

void STInit(ST* ps);

的销毁 

void STDestroy(ST* ps);

  

void StackPush(ST* ps, STDataType x);

void STPop(ST* ps);

顶元素

STDataType STTop(ST* ps);

获取中有效元素个数 

int STSize(ST* ps);

判断是否为空

bool STEmpty(ST* ps);

完整代码

Stack.h

#pragma once#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<stdbool.h>//定义的结构
typedef int STDataType;
typedef struct Stack
{STDataType* arr;int capacity;     //的空间大小int top;          //顶
}ST;void STInit(ST* ps);
void STDestroy(ST* ps);//顶---入数据、出数据
void StackPush(ST* ps, STDataType x);
void StackPop(ST* ps);//取顶元素
STDataType StackTop(ST* ps);bool StackEmpty(ST* ps);//获取中有效元素个数
int STSize(ST* ps);

Stack.c

#include"Stack.h"void STInit(ST* ps)
{assert(ps);ps->arr = NULL;ps->capacity = ps->top = 0;
}void STDestroy(ST* ps)
{assert(ps);if (ps->arr)free(ps->arr);ps->arr = NULL;ps->top = ps->capacity = 0;
}void StackPush(ST* ps, STDataType x)
{assert(ps);//1.判断空间是否足够if (ps->capacity == ps->top){int newCapacity = ps->capacity == 0 ? 4 : 2 * ps->capacity;STDataType* tmp = (STDataType*)realloc(ps->arr, newCapacity * sizeof(STDataType));if (tmp == NULL){perror("realloc fail!");exit(1);}ps->arr = tmp;ps->capacity = newCapacity;}//空间足够ps->arr[ps->top++] = x;
}
bool StackEmpty(ST* ps)
{assert(ps);return ps->top == 0;
}
void StackPop(ST* ps)
{assert(ps);assert(!StackEmpty(ps));--ps->top;
}//取顶元素
STDataType StackTop(ST* ps)
{assert(ps);assert(!StackEmpty(ps));return ps->arr[ps->top - 1];
}//获取中有效元素个数
int STSize(ST* ps)
{assert(ps);return ps->top;
}

test.c 

#include"Stack.h"void STTest()
{ST st;STInit(&st);//StackPush(&st, 1);StackPush(&st, 2);StackPush(&st, 3);StackPush(&st, 4);printf("size: %d\n", STSize(&st));//4//StackPush(&st, 5);//StackPop(&st);//循环出,直到为空while (!StackEmpty(&st)){STDataType data = StackTop(&st);printf("%d ", data);//出StackPop(&st);}printf("size: %d\n", STSize(&st));//0///STDestroy(&st);
}int main()
{STTest();return 0;
}

的练习题

习题1

解析 :

A错误:是一种后进先出的数据结构,队列是先进先出的

B正确:顺序表和链表都可以用来实现,不过一般都使用顺序表,因为想当于是阉割版的顺序表,只用到了顺序表的尾插和尾删操作,顺序表的尾插和尾删不需要搬移元素效率非常高,故一般都是使用顺序表实现

C错误:只能在顶进行输入的插入和删除操作

D错误:是有入和出操作,出就是从中删除一个元素

习题2

解析:

此题在校招选择题中出现较频繁,稳妥的做法是画图逐个选项检测,大概率是不会出错的。如果是E先出,说明ABCDE都已经全部入,E出之后,此时顶元素是D,如果再要出应该是D,而不应该是C。故答案应该选择D

 

习题3

解析:

A错误,如果是链,一般需要进行头插或者头删操作,而顺序一般进行尾插和尾删操作,链表的操作比顺序表复杂,因此使用顺序结构实现更简单

B错误,原因参考A

C正确,链式结构实现时,每次入相当于链表中头插一个节点,没有扩容一说

 


http://www.ppmy.cn/devtools/115169.html

相关文章

28V_1MHZ电子烟,无线鼠标,医疗器械等专用恒频升压转换器超小体积封装

概述&#xff1a; PC7128是一款高效、准恒频升压转换器&#xff0c;具有输入/输出隔离功能开关、涌流限制、内部软启动和补偿。它可以从Li电池的典型3.6V轨道输入端输出高达28V的电压。1.0 MHz的开关频率适用于小型外部组件&#xff0c;为各种负载电流提供了一种紧凑的解决方案…

【人工智能学习笔记】6_自然语言处理基础

自然语言处理基本介绍 自然语言:指人类使用的在社会生活中自然形成的语言; 自然语言处理:指计算机识别、理解、计算分析、生成自然语言的过程。 包含自然语言理解和自然语言生成两部分的两大研究方向。 自然语言理解:所有支持机器理解文本内容的方法模型或任务的总称,是推…

2024/9/21 408 20题

a b 58-130-180-199-42-15&#xff1a;c d a 184-182-187-176-19941 c d a a c b d c a c b c c c

LeetCode 260. 只出现一次的数字 III

更多题解尽在 https://sugar.matrixlab.dev/algorithm 每日更新。 组队打卡&#xff0c;更多解法等你一起来参与哦&#xff01; LeetCode 260. 只出现一次的数字 III&#xff0c;难度中等。 位运算 解题思路&#xff1a; 根据相同的数字异或结果为 0 的特性&#xff0c;我们…

本地部署大模型并使用知识库Windows下Ollama+Docker+MaxKB安装的记录

概要 本文介绍本地部署大模型和知识库的小白方法&#xff0c;可以运行较多种类的大模型&#xff0c;使用的软件为docker和ollama以及MaxKb作为知识库前端。 下载 各安装包可以百度去官网或者github下载或使用&#xff0c;也可以点击下面的的链接和我下载相同的版本。 ollama…

Java 每日一刊(第13期):this super static

“优秀的代码不仅仅是给机器看的&#xff0c;更是给人看的。” 前言 这里是分享 Java 相关内容的专刊&#xff0c;每日一更。 本期将为大家带来以下内容&#xff1a; this 关键字super 关键字static 关键字 this 关键字 this 关键字是 Java 中最常见的关键字之一&#xf…

C++11 Lambda 多参数传递及外部this传递

const SocketChannelPtr& channel getChannel(connfd); ....... //lambda函数定义&#xff1a; channel->onread [this, &channel](Buffer* buf) { HttpClientContext* ctx channel->getContext<HttpClientContext>(); ...... }; 调用&#xff1a;…

【Linux】基础IO认识(2)

基础IO认识&#xff08;2&#xff09; 1、补充系统调用1、1、read调用1、2、stat 2、重定向2、1、文件描述符的分配规则2、2、实现重定向(dup2) 3、缓冲区的理解3、1、缓冲区典型实例3、2、缓冲区代码形式展示 4、深化和实践利用4、1、在shell中加入重定向4、2、简单实现库的封…