首页 > 其他分享 >栈1: 栈的顺序存储

栈1: 栈的顺序存储

时间:2024-04-18 19:57:07浏览次数:30  
标签:return sqStack 元素 NULL data 顺序存储 size

栈: 顺序存储


栈是一种先进后出(First In Last Out,FILO)的数据结构

如果你将两个元素压入栈,先加入的元素将在后加入的元素之后出栈


栈顶元素值为null(未满时)


定义栈的数据结构

#define MAX_SIZE 1024
//利用数组模拟栈的顺序存储
typedef struct sqStack{
    void *data[MAX_SIZE];
    int size; //栈的元素数量
} sqStack;

初始化

sqStack* initStack(){
    sqStack *s = (sqStack*)malloc(sizeof(sqStack));
    for (int i = 0; i < MAX_SIZE; i++){
        s->data[i] = NULL;
    }
    s->size = 0;
    return s;
};

入栈

void PushStack(sqStack *s, void* data){
    if(s==NULL) return; //如果栈为空
    if(s->size==MAX_SIZE) return; //如果栈已满
    if(data==NULL) return; //如果插入数据为null

    s->data[s->size] = data;
    s->size++;
};

返回栈顶元素

void* topSqStack(sqStack *s){
    if(s==NULL) return NULL; 
    if(s->size==0) return NULL;

    return s->data[(s->size-1)]; //第一个元素在栈顶之下
};

弹出栈顶元素

void* PopStack(sqStack *s){
    if(s==NULL) return NULL; 
    if(s->size==0) return NULL; 

    s->data[s->size-1] = NULL; //将元素弹出 
    s->size--; //栈顶下移
};

判断栈是否为空

int ifEmpty_Stack(sqStack *s){
    if(s==NULL) return -1; //SQstack_ERROR
    if(s->size==0) return 1; //SQStack_TRUE
    return 2; //SQStack_FALSE
};

返回栈中的元素个数

int Size_Stack(sqStack *s){
    if(s==NULL) return -1;
    return s->size;
};

清空栈

void clear_Stack(sqStack *s){
    if(s==NULL) return; 
    if(s->size==0) return; 
    for (int i = 0; i < s->size; i++){
        s->data[i] = NULL; //清空所有数据
    }
    s->size=0;
};

销毁栈

void destroy_Stack(sqStack *s){
    if(s==NULL) return;  
    free(s);
};

栈顺序存储的测试

定义栈中元素的数据结构

typedef struct PERSON{
    char name[64];
    int age;
} Person;

测试

int main(){
    //创建栈
    sqStack* stack = initStack();
    //创建数据
    Person p1 = {"aaa",10};
    Person p2 = {"bbb",20};
    Person p3 = {"ccc",30};
    Person p4 = {"ddd",40};
    //进栈
    PushStack(stack, &p1);
    PushStack(stack, &p2);
    PushStack(stack, &p3);
    PushStack(stack, &p4);
    //输出
    while(Size_Stack(stack)>0){
        //访问栈顶元素
        Person* person = (Person*)topSqStack(stack);
        cout << person->name << " " << person->age << endl;
        //弹出栈顶元素
        PopStack(stack);
    }
    //释放内存
    destroy_Stack(stack);

    system("pause");
    return 0;
}

返回元素的顺序与压入的顺序相反(先进后出)

标签:return,sqStack,元素,NULL,data,顺序存储,size
From: https://www.cnblogs.com/HIK4RU44/p/18144273

相关文章

  • 数据结构之线性表(顺序存储表)
    php<?php/***CreatedbyPhpStorm.*User:SillyCat*Date:2024/3/2*Time:18:47*/classSequenceList{private$item=array();private$length=0;publicfunction__construct(){//$this->item=$item;......
  • 【数据结构】详谈队列的顺序存储及C语言实现
    循环队列及其基本操作的C语言实现前言大家好,很高兴又和大家见面啦!!!在上一篇内容中,我们在介绍完队列的基本概念、重要术语以及基本操作后,又回顾了一下数据结构的三要素——数据的逻辑结构、数据的存储结构以及数据的运算。队列这种数据结构我们已经介绍了它的逻辑结构以及数据运算......
  • 简单的顺序存储容器
    本文简述了一个实现了顺序存储的容器类(Array),并对其进行了验证。此Array类具有如下能力:支持泛型指定存储容量可用列表(initializer_list)初始化支持拷贝和移动语义可按值或引用传递此类的对象,也可作为值返回可用下标运算符访问元素支持基于范围的循环◆实现使用类模板......
  • 11.16线性表A,B顺序存储合并
     #include<iostream>#include<cstring>usingnamespacestd;typedefstructf{intdata;f*next;}node,*Node;voidbuild(f*p){intx;while(cin>>x&&x!=-1){f*now=newnode();now->data=x;......
  • 线性表A,B顺序存储合并
    7-1线性表A,B顺序存储合并有两张非递增有序的线性表A,B,采用顺序存储结构,两张表合并用c表存,要求C为非递减有序的,然后删除C表中值相同的多余元素。元素类型为整型#include<iostream>#include<cstring>usingnamespacestd;typedefstructf{intdata;f*next;}node,*......
  • 2008秋季-计算机软件基础- 线性表顺序存储 - 菜单
    /*2008-10-27*//*tod:删除,修改,参考:教材P63-67*/#include<stdio.h>#defineN1typedefstructstudent{charxuehao[10];charxingming[10];intchengji;}S;voidxianshicaidan(){printf("\n1-Initialization.\n");......
  • 2008秋季-计算机软件基础-线性表的顺序存储(顺序表)
    引例:在一维数组中插入和删除元素//在一维数组中插入和删除元素//2008-8-31#include<stdio.h>voidmain(){//在一维数组位置Location处插入EintList[10]={0,1,2,3,4,5};intListLength=6;//表长intE=6;//被插入的元素inti;//循环变量intLocati......
  • 2008秋-顺序栈-顺序存储结构的栈
    /*---------------------------------------------------------Title:SequenceStack(顺序栈)顺序栈-顺序存储结构的栈请先阅读教材67页,2.3.2,2.3.3节,栈的定义及基本运算(注意以下程序为简化后的,仅供入门学习之用)-------------------------------------------------......
  • 顺序存储的满m叉树编号为 k 的结点的双亲结点的编号
    顺序存储的满m叉树编号为i的结点的孩子结点的编号的范围设其编号为k,在它之前的结点个数等于i结点之前的每个结点的孩子数,再加上一个根节点,于是\[k=(i-1)m+1+1\\(i-1)m+2\]最后一个孩子结点的编号\[k+m-1=(i-1)m+2+m-1\\=(i-1)m+m+1\]编号为k的结点的双亲结点的编号假......
  • 二叉树(顺序存储要维护关系)
                    ......