首页 > 其他分享 >双栈:数组实现

双栈:数组实现

时间:2024-07-18 14:40:41浏览次数:11  
标签:DoubleStack 实现 Top 栈顶 双栈 int TP 数组 TB

双栈:数组实现

结构描述:

#include <iostream>
#include <cstdlib>
#define MAX 100
using namespace std;

typedef int DataType;
class DoubleStack {
public:
    DataType *A;
    //两个栈的栈顶
    int TP;
    int TB;

    //建立一个空栈
    void Init();
    //判空、判满
    bool IsEmpty();
    bool IsFull();
    //入栈,根据Top的值入栈
    void Push(DataType X, int Top);
    //出栈,根据Top的值出栈
    void Pop(int Top);
    //摧毁栈
    void MakeEmpty();
    //获取栈顶元素,根据栈顶的值
    DataType GetTopValue(int Top);

    //获取两个栈顶的指针
    int GetTP();
    int GetTB();
};

初始化

栈顶指针分别置为 -1MAX 即可;

A 分配空间

void DoubleStack::Init() {
    A = (DataType *)malloc(sizeof (DataType) * MAX);
    TP = -1;
    TB = MAX;
}

判空、判满

栈空时即两个栈顶都是初始位置

栈满时,TP + 1 == TB

bool DoubleStack::IsFull() {
    return TP + 1 == TB;
}

bool DoubleStack::IsEmpty() {
    return TP == -1 && TB == MAX;
}

入栈

  • 栈满:报错
  • 非满:
    • 根据传入的参数,选择对哪个栈进行操作;
    • Top == TPA[++TP] = X;
    • Top == TBA[--TB] = X;
void DoubleStack::Push(DataType X, int Top) {
    //栈非空
    if (IsFull()) {
        cout << "Stack Is Full!" << endl;
        exit(-1);
    }

    if (Top == TP) {
        A[++TP] = X;
    }

    else if (Top == TB) {
        A[--TB] = X;
    }
    else {
        cout << "This is not the top of the stack!" << endl;
        exit(-1);
    }
}

出栈

  • 栈空:报错
  • 非空:
    • 根据栈顶的值来进行操作:
      • if (Top == TP) TP--;
      • if (Top == TB) TB++;
      • else Err;
void DoubleStack::Pop(int Top) {
    if (IsEmpty()) {
        cout << "Stack is Empty!" << endl;
        exit(-1);
    }

    if (Top == TP) {
        TP--;
    }
    else if (Top == TB) {
        TB++;
    }
    else {
        cout << "This is not the top of stack!" << endl;
        exit(-1);
    }
}

获取栈顶元素

  • 栈空:报错
  • 非空:根据传入的栈顶信息,直接返回
DataType DoubleStack::GetTopValue(int Top) {
    if (IsEmpty()) {
        cout << "Stack is empty!\n";
        exit(-1);
    }
    else {
        return A[Top];
    }
}

摧毁

  • 栈空:报错
  • 非空:一直出栈,直至栈空
void DoubleStack::MakeEmpty() {
    if (IsEmpty()) {
        cout << "Stack is empty!\n";
        exit(-1);
    }

    while (TP != -1) {
        Pop(TP);
    }

    while (TB != MAX) {
        Pop(TB);
    }
}

获取栈顶指针

  • 栈空:报错
  • 非空:返回
int DoubleStack::GetTP() {
    if (IsEmpty()) {
        cout << "Stack is empty!\n";
        exit(-1);
    }
    return TP;
}
int DoubleStack::GetTB() {
    if (IsEmpty()) {
        cout << "Stack is empty!\n";
        exit(-1);
    }   
    return TB;
}

错误记录

TP自增,却用Top为下标给其赋值,怪不得会出错

void DoubleStack::Push(DataType X, int Top) {
    if (Top == TP) {
        TP++;
    }

    else if (Top == TB) {
        TB--;
    }
    else {
        cout << "This is not the top of the stack!" << endl;
        exit(-1);
    }

    A[Top] = X;
}

标签:DoubleStack,实现,Top,栈顶,双栈,int,TP,数组,TB
From: https://www.cnblogs.com/codels/p/18309484

相关文章

  • 栈:数组实现
    栈:数组实现结构描述:#defineMAX100typedefintDataType;classSeqStack{public:DataType*A;intTop;voidInit();voidPush(DataTypeX);voidPop();DataTypeGetTop();voidMakeEmpty();boolIsEmpty();boolIsFull()......
  • C++ 返回数组指针简单测试
    C++返回数组指针简单测试:#include<iostream>staticconstsize_tARR_SIZE=10;staticintarr[ARR_SIZE];//更新数组#defineUPDATE_ARR_DATA(i)for(size_tj=0;j<ARR_SIZE;++j)\{\a......
  • C 语言实例 - 数组拆分与合并
    将一个数组拆分为两个数组,一个为奇数数组,一个为偶数数组实例#include<stdio.h>intmain(){intarray[10]={0,1,2,3,4,5,6,7,8,9};inteven[10],odd[10];intloop,e,d;e=d=0;for(loop=0;loop<10;loop++){......
  • 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.淘宝......
  • Python数据可视化之numpy的11个常用的创建数组的函数
    numpy库在处理成千上万的数据时,Python的1维列表已经不适合来对数据进行处理,效率会很慢,所以numpy就诞生了,他可以将列表变成数组,而数组可以是1维、2维、3维甚至更高纬度,可用于存储和处理大型的矩阵,此外numpy提供了大量的数学函数,包括数学、逻辑、形态操作、排序、选择,输出和......
  • Qt实现仪表盘-自定义控件
            仪表盘在很多汽车和物联网相关的系统中很常用,本文就来介绍一下Qt 仪表盘的实现示例,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。一、简述         使用Qt绘制一个仪表盘,用来显示当前的温度,绘制刻度、绘制数字......
  • QT利用QPainter实现自定义圆弧进度条组件
               在可视化应用中,弧形进度条应用也比较广泛,本文示例封装了一个可复用、个性化的弧形进度条组件。本文示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。主要结构就是外围一圈圆角进度,中间加上标题和对应进度的百分比,进度条的起始角......