基于顺序表实现栈的基本操作

栈:什么是栈?又该怎么理解呢?
  • 栈(stack)又名堆栈,它是一种运算受限的线性表。其限制是仅允许在表的一端进行插入和删除运算。这一端被称为栈顶,相对地,把另一端称为栈底。

  • 栈就是一个桶,后放进去的先拿出来,它下面本来有的东西要等它出来之后才能出来(先进后出)

  • 栈(Stack)是操作系统在建立某个进程时或者线程(在支持多线程的操作系统中是线程)为这个线程建立的存储区域,该区域具有FIFO的特性,在编译的时候可以指定需要的Stack的大小。
    这里写图片描述

下面实现栈的基本操作

  • 初始化
  • 入栈
  • 出栈
  • 取栈顶元素
  • 销毁栈
SeqStack.h文件内容

#pragma once

#include <stddef.h>

#include <stdio.h>

typedef char SeqStackType;

typedef struct SeqStack
{
      SeqStackType *data;
      size_t size;  //有效元素个数
      size_t capicity;  //等效与Maxsize
}SeqStack;

void SeqStackInit(SeqStack* stack); //初始化栈

void SeqStackPrint(SeqStack* stack,const char *s);  //打印栈

void SeqStackPush(SeqStack* stack,SeqStackType value);  //入栈

void SeqStackPop(SeqStack* stack);  //出栈

int SeqStackTop(SeqStack* stack,SeqStackType* value);   //取栈顶元素

void SeqStackDestory(SeqStack* stack);  //销毁栈

初始化时,有效元素size为0;同时设置顺序表容量,并且给指针分配内存空间

//初始化栈
void SeqStackInit(SeqStack* stack)  
{
    if(stack==NULL)
    {
          printf("非法输入\n");
          return ;
    }
    stack->size=0;
    stack->capicity=1024;   //设置容量
    stack->data=(SeqStackType*)malloc(stack-       >capicity*sizeof(SeqStack)); //申请空间
}

这里写图片描述

扩容时,扩容策略由自己定。capicity一般将他直接扩大二倍,是由于STL的扩容原则这样规定,+1是为了排除原来大小是0的情况

//扩容
void  SeqStackResize(SeqStack* stack)
{

    if(stack==NULL)
    {
          printf(  "  非法输入\n");
          return ;
    }
    SeqStackType* new=NULL;
    //如果size>capicity,则扩容
    if(stack->size>=stack->capicity)
    {
          //扩大capicity
          stack->capicity=stack->capicity*2+1;
          //申请内存
          new=(SeqStackType *)malloc(stack->capicity*sizeof( SeqStack));
    }
     size_t i=0;
     //搬移数据
    for(  ;i<stack->size;i++)
     {
         new[i]=stack->data[i];
     }
    //释放原来的指针
    free(stack->data);

    stack->data=new;
}

从栈顶进入。入栈时需要考虑size大于顺序表的特殊情况,当超出时,需要扩容。

//入栈
void SeqStackPush(SeqStack* stack,SeqStackType value)
{

    if(stack==NULL)
    {
          printf(  "  非法输入\n");
          return ;
    }
    if(stack->size>=stack->capicity)
    {
          SeqStackResize(stack);
    }
    stack->data[stack->size++]=value;
}

这里写图片描述

出栈时要考虑空栈情况,若空栈,没有元素出栈。出栈失败。出栈操作只需要将有效元素减1即可。

//出栈
void SeqStackPop(SeqStack* stack)
{

    if(stack==NULL)
    {
          printf(  "  非法输入\n");
          return ;
    }
    if(  stack->size==0)
    {
          printf("空栈\n");
          return ;
    }
    --stack->size;
}

这里写图片描述

取栈顶元素时记住不是删除栈顶元素,而是将其取出来,所以
*value=stack->data[stack->size-1];这里是size-1.而不是size–,取栈顶元素,而不是删除栈顶元素

//取栈顶元素
int SeqStackTop(SeqStack* stack,SeqStackType* value)    
{
      //取值失败返回0,成功返回1
    if(stack==NULL||value==NULL)
    {
          printf(  "  非法输入\n");
          return 0;
    }
    if(  stack->size==0)
    {
          printf("空栈\n");
          return 0;
    }
    *value=stack->data[stack->size-1];//这里是size-1.而不是size--
    return 1;

}

这里写图片描述

销毁队列时,除了将有效元素置为零,还需要将容量capicity设置为零,释放data指针。

//销毁队列
void SeqStackDestory(SeqStack* stack)
{
      if(stack==NULL)
      {
            printf("非法操作\n");
            return;
      }
      stack->size=0;
      stack->capicity=0;
      free(stack->data);

}

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值