数据结构实验之栈的实现----栈的基础操作(附代码)

先上干货:

栈(Stack)是一种具有特定操作规则的数据结构,它按照后进先出(LIFO,Last In First Out)的原则进行操作。栈可以简单地理解为一个容器,元素只能从栈顶入栈和出栈,而不能在中间或底部进行操作。

栈的定义包含以下要素:

  1. 存储空间:栈通常使用数组或链表来实现存储空间。
  2. 栈顶指针:用来指示当前栈顶元素的位置。初始时,栈为空,栈顶指针指向一个特定的空位置。
  3. 入栈操作(Push):将元素压入栈顶,使得栈顶指针向上移动,并将元素放入新的栈顶位置。
  4. 出栈操作(Pop):将栈顶元素弹出,即移除栈顶元素,同时栈顶指针向下移动。
  5. 栈空判断:判断栈是否为空,即栈顶指针是否指向空位置。
  6. 栈满判断(对于顺序栈):当栈中元素个数已达到最大容量时,称栈为满栈。

栈常用于需要后进先出操作的场景,例如函数调用的递归、表达式求值、括号匹配等。

SeqStack.h部分:

#include <stdio.h>
#include <malloc.h>
#include<string.h>
#include <assert.h>
typedef int ElemType;//定义栈中元素类型
#define MaxSize 100 //定义顺序栈初始存储空间大小

typedef struct SeqStack  //定义栈结构
{
    ElemType *base; //顺序栈存储空间基地址
    int top; //栈顶位置,同时也表示栈中元素个数
    int Stack_size;  //栈当前空间大小,以元素为单位
}SeqStack;

void initStack(SeqStack *s);//初始化栈
int isFull(SeqStack *s);//判断栈是否已满
int isEmpty(SeqStack *s);//判断栈是否为空
void push(SeqStack *s,ElemType x);//入栈
void pop(SeqStack *s);//出栈
char getTop(SeqStack *s,ElemType *v); //获得栈顶元素
int length(SeqStack *s);//返回栈中元素个数
void destroy(SeqStack *s);//销毁栈

该代码段给出了一个顺序栈(Sequential Stack)的实现,同时还包括了栈的各种操作函数。下面对每个函数进行详细解释:

  1. initStack(SeqStack *s):初始化栈函数。用于对栈进行初始化,包括动态分配存储空间,并将栈顶指针和栈大小置零。

  2. isFull(SeqStack *s):判断栈是否已满函数。用于检查栈是否已经满员,即判断栈中元素个数是否达到栈的最大容量。

  3. isEmpty(SeqStack *s):判断栈是否为空函数。用于检查栈是否为空,即判断栈中元素个数是否为零。

  4. push(SeqStack *s, ElemType x):入栈函数。将元素 x 入栈,将栈顶指针上移,并将元素放入新的栈顶位置。

  5. pop(SeqStack *s):出栈函数。将栈顶元素弹出,即移除栈顶元素,同时栈顶指针下移。

  6. getTop(SeqStack *s, ElemType *v):获得栈顶元素函数。将栈顶元素的值存储在指针 v 所指向的变量中,并返回一个标志位,表示操作是否成功。

  7. length(SeqStack *s):返回栈中元素个数函数。用于返回栈中当前元素个数,即栈顶指针的值。

  8. destroy(SeqStack *s):销毁栈函数。释放栈所占用的存储空间,并将相关变量重置为初始状态。

SeqStack.c部分:

#include "SeqStack.h"

void initStack(SeqStack *s)
{
    s->base=(ElemType)malloc(sizeof(ElemType)*MaxSize);
    s->top=-1;
    s->Stack_size=MaxSize;
}
int isFull(SeqStack *s)
{    if(s->top==s->Stack_size){
        printf("栈满!\n");
        return NULL;
    }
    return 1;
}
int isEmpty(SeqStack *s)
{
    if(s->top==-1){
        printf("栈空!\n");
        return 1;
    }else {
    printf("栈非空\n");}
    return NULL;
}
void push(SeqStack *s,ElemType x)
{
    s->top=s->top+1;
    s->base[s->top]=x;
    return;
}
void pop(SeqStack *s)
{
    if(s->top>=0)
    s->top--;
    return ;
}
char getTop(SeqStack *s,ElemType *v)
{
    v=s->base[s->top];
    printf("获得栈顶元素%d\n",v);
    return 0;
}
int length(SeqStack *s)
{
    return s->top;
}
void destroy(SeqStack *s)
{
    free(s->data); // 释放栈所占用的内存空间
    s->top = -1; // 将栈顶指针重置为初始位置
    s->size = 0; // 将栈的大小设置为0,表示栈为空
}


 

main.c部分:

#include "SeqStack.h"
int main()
{
    SeqStack s;
    initStack(&s);
    int x;
    int v=3;
    while(v--)
    {
    scanf("%d",&x);
    push(&s,x);
    }
    getTop(&s,v);
    destroy(&s);
}


 

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

善程序员文

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值