首页 > 其他分享 >栈:链表实现

栈:链表实现

时间:2024-07-18 14:40:59浏览次数:16  
标签:Node 实现 Top 链表 DataType StackLinked NewNode void

栈:链表实现

结构描述

#include <iostream>
#include <cstdlib>

typedef int DataType;
using namespace std;

typedef struct Node {
    DataType A;
    struct Node * Next;
}Node;

class StackLinked {
private:
    Node * Top;
public:    
    void Push(DataType X);
    void Pop();
    DataType GetTop();
    void MakeEmpty();

    Node * BuyNode(DataType X);
    void Init();
    bool IsEmpty();
};

初始化

Top 置为空

void StackLinked::Init() {
	Top = nullptr;
}

判空

Top 为空指针,则栈为空

bool StackLinked::IsEmpty() {
	return Top == nullptr;
}

分配空间

把分配空间封装成一个一个一个方法

Node * StackLinked::BuyNode(DataType X) {
	Node * NewNode = (Node *)malloc(sizeof(Node));
	if (NewNode == nullptr) {
		cout << "Malloc Failed!" << endl;
		exit(-1);
	}

	NewNode->A = X;
	NewNode->Next = nullptr;

	return NewNode;
}

入栈

使用头插法入栈,无特殊情况

分配一个新的节点 NewNode,并将 NewNode 指向 Top,然后再将 Top 指向 NewNode,对栈为空和非空都适用。

void StackLinked::Push(DataType X) {
	Node * NewNode = BuyNode(X);

	NewNode->Next = Top;
	Top = NewNode;
}

出栈

  • 栈空:报错
  • 非空:头删法出栈

创建一个临时指针 Tmp,用于保存当前 Top 指向的节点,把 Top 向后移动一位,即 Top = Top->Next,然后把 Tmp 释放。

void StackLinked::Pop() {
	if (IsEmpty()) {
		cout << "Stack Is Empty!" << endl;
		exit(-1);
	}

	Node * Tmp = Top;
	Top = Top->Next;
	free(Tmp);
	Tmp = nullptr;
}

获取栈顶元素

  • 栈空:报错
  • 非空:返回 Top 指向的节点的元素
DataType StackLinked::GetTop() {
	if (IsEmpty()) {
		cout << "Stack Is Empty!" << endl;
		exit(-1);
	}

	return Top->A;
}

摧毁栈

  • 栈空:报错
  • 非空:一直出栈,直至栈空
void StackLinked::MakeEmpty() {
	if (IsEmpty()) {
		cout << "Stack Is Empty!" << endl;
		exit(-1);
	}

	while (!IsEmpty()) {
		Pop();
	}
}

标签:Node,实现,Top,链表,DataType,StackLinked,NewNode,void
From: https://www.cnblogs.com/codels/p/18309486

相关文章

  • 双栈:数组实现
    双栈:数组实现结构描述:#include<iostream>#include<cstdlib>#defineMAX100usingnamespacestd;typedefintDataType;classDoubleStack{public:DataType*A;//两个栈的栈顶intTP;intTB;//建立一个空栈voidInit();//判空、......
  • 栈:数组实现
    栈:数组实现结构描述:#defineMAX100typedefintDataType;classSeqStack{public:DataType*A;intTop;voidInit();voidPush(DataTypeX);voidPop();DataTypeGetTop();voidMakeEmpty();boolIsEmpty();boolIsFull()......
  • Stable Diffusion【进阶篇】:真人漫改之图生图实现
    所谓真人漫改,就是把一张真人的图片生成一张新的二次元的图片,在StableDiffusion中,有很多方式实现,其中通过图生图的方式是最常用的方式,大概1-3分钟就可以完成。本文我们系统的讲解一下。下面我们来详细看一下图生图实现真人漫改的具体实现方式。【第一步】:图生图图片上......
  • Stable Diffusion【进阶篇】:真人漫改之IP-Adapter实现
    大家好,今天我分享真人漫改实现方式:借助ControlNet的IP-Adapter控制模型,IP-Adapter控制模型是由腾讯研究院出品的一个新的ControlNet模型,关于该模型可以理解为图片提示词,类似于MD垫图的效果,但是比tagger标签器提取出图片的元素构成效果更好。它不仅参考图片的风格、光影特效......
  • Stable Diffusion ControlNet垫图:IP-Adapter实现图片风格迁移
    IP-Adapter实现的SD垫图功能对我们的图片处理非常有用,后面我们会进行一系列IP-Adapter的应用分享,通过具体的实例真正看到IP-Adapter的强大。文章使用的AI工具SD整合包、各种模型插件、提示词、AI人工智能学习资料都已经打包好放在网盘中了,无需自行查找,有需要的小伙伴下方扫......
  • 基于DrissionPage实现淘宝商品信息的批量获取
    摘要本文章主要讲解如何利用DrissionPage来避开淘宝的反爬机制,批量获取商品信息并保存到xlsx表格文件中,用于数据分析或深度学习模型的训练。(注:本文代码为一步一步调试出来的测试版,只是提供调试思路以及初步实现,并不能作为高效的成品程序,如有需要还请各位自行编写喵)1.淘宝......
  • Qt实现仪表盘-自定义控件
            仪表盘在很多汽车和物联网相关的系统中很常用,本文就来介绍一下Qt 仪表盘的实现示例,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。一、简述         使用Qt绘制一个仪表盘,用来显示当前的温度,绘制刻度、绘制数字......
  • QT利用QPainter实现自定义圆弧进度条组件
               在可视化应用中,弧形进度条应用也比较广泛,本文示例封装了一个可复用、个性化的弧形进度条组件。本文示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。主要结构就是外围一圈圆角进度,中间加上标题和对应进度的百分比,进度条的起始角......
  • uniapp [全端兼容] - 详细实现接入使用海康威视监控云端显示及控制功能,网站集成安装海
    前言如果需要Vue版本,请访问这篇文章。在uni-app全平台兼容(H5网页网站、支付宝/微信小程序、安卓App、苹果App、nvue)项目开发中,详解免费安装使用“海康威视监控摄像头”在网页中对接设备并进行实时显示监控画面及各种功能操作控制教程,对接海康视频监控播放及回放......
  • 浏览器缓存:强缓存与协商缓存实现原理有哪些?
    1、强缓存:设置缓存时间的,那么在这个时间内浏览器向服务器发送请求更新数据,但是服务器会让其从缓存中获取数据。可参考:彻底弄懂强缓存与协商缓存-简书2、协商缓存每次都会向浏览器询问,那么是怎么询问的呢?cache-control:no-cache,每次请求都回询问服务端,那么是如何询问?当浏......