数据结构——栈的顺序存储结构

简介: 数据结构——栈的顺序存储结构


目录

定义

栈的结构

栈的初始化

入栈函数

栈的销毁

出栈函数(删除)

判断栈是否为空

取栈顶函数

遍历栈函数

计算栈的大小

使用


定义

栈(stack)是限定仅在表尾进行插入和删除的线性表。

允许插入和删除的一段称为栈顶(top),另一端称为栈底(bottom),不含任何元素的栈称为空栈。栈又称后进先出的(Last In First Out)线性表,简称LIFO结构。

栈的插入操作,叫作进栈,也称压栈、入栈

栈的删除操作,叫作出栈,有的也叫弹栈

栈的结构

//栈的结构
typedef int STDataType;
typedef struct Stack
{
  STDataType* a;
  int top;       //栈顶,所存数据个数
  int capacity;  //容量
}ST;

栈的初始化

void StackInit(ST* ps)
{
  assert(ps);
  ps->a = NULL;
  ps->capacity = 0;
  ps->top = 0;
}

入栈函数

//入栈
void stackPush(ST* ps, STDataType x)
{
  assert(ps);
  if (ps->top == ps->capacity)
  {
    //若容量为0,开辟四个空间,否则开辟原先容量二倍的空间
    int newcapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;
    STDataType* tmp = (STDataType*)realloc(ps->a,sizeof(STDataType) * newcapacity);
    if (!tmp)
    {
      printf("内存不够,空间开辟失败!");
      exit(-1);
    }
    ps->a = tmp;
    ps->capacity= newcapacity;
  }
  ps->a[ps->top] = x;
  ps->top++;
}

栈的销毁

void StackDistory(ST*ps)
{
  assert(ps);
  free(ps->a);
  ps->capacity = 0;
  ps->top = 0;
}

出栈函数(删除)

void StackPop(ST*ps)
{
  assert(ps);
  assert(ps->top>0);
  ps->top -= 1;
}

判断栈是否为空

bool StackEmpty(ST* ps)
{
  assert(ps);
  return ps->top == 0;//为空时返回1(true),不为空返回0(flase)
}

取栈顶函数

int StackTop(ST* ps)
{
  assert(ps);
  assert(ps->top > 0);
  return ps->a[ps->top - 1];
}

遍历栈函数

//栈的遍历必须先打印栈顶,然后出栈,再打印下一个(新的栈顶),
//遍历结束后该栈变为空栈,不在使用的化就进行销毁
void STPrintf(ST*ps)
{
  assert(ps);
  while (ps->top)
  {
    printf("%d  ", ps->a[ps->top]);
    ps->top--;
  }
    StackDistory(ps);
}

计算栈的大小

void StackSize(ST*ps)
{
  assert(ps);
  printf("%d", ps->top);
}

使用

int main()
{
  ST stack = { 0 };
  StackInit(&stack);
  while (1)
  {
    int x;
    scanf("%d", &x);
    if (x == -1)
      break;
    stackPush(&stack, x);
  }
  STPrintf(&stack);
  printf("\n\n");
  StackPop(&stack);
  StackPop(&stack);
  StackPop(&stack);
  STPrintf(&stack);
  printf("\n\n");
  printf("%d", StackTop(&stack));
  printf("\n\n");
  printf("%d", StackEmpty(&stack));
  printf("\n\n");
  StackSize(&stack);
  printf("\n\n");
  printf("%d", StackEmpty(&stack));
}


相关文章
|
4天前
栈的几个经典应用,真的绝了
文章总结了栈的几个经典应用场景,包括使用两个栈来实现队列的功能以及利用栈进行对称匹配,并通过LeetCode上的题目示例展示了栈在实际问题中的应用。
栈的几个经典应用,真的绝了
|
1天前
|
负载均衡 网络协议 安全
DKDP用户态协议栈-kni
DKDP用户态协议栈-kni
|
1天前
|
负载均衡 网络协议 安全
DPDK用户态协议栈-KNI
DPDK用户态协议栈-KNI
|
1天前
|
测试技术
【初阶数据结构篇】栈的实现(附源码)
在每一个方法的第一排都使用assert宏来判断ps是否为空(避免使用时传入空指针,后续解引用都会报错)。
|
1天前
|
存储 算法 测试技术
【初阶数据结构篇】实现顺序结构二叉树(堆的实现方法)
注意传过去的参数是插入的位置,即插入前的size,在调整完后再将size++
|
4天前
|
存储 缓存 算法
深入解析B树:数据结构、存储结构与算法优势
深入解析B树:数据结构、存储结构与算法优势
【数据结构】栈和队列
【数据结构】栈和队列
|
6天前
|
算法 C语言 C++
【practise】栈的压入和弹出序列
【practise】栈的压入和弹出序列
|
6天前
|
C语言
用栈实现将一个十进制数值转换成八进制数值。即用该十进制数值除以8,并保留其余数;重复此操作,直到该十进制数值为0为止。最后将所有的余数反向输出就是所对应的八进制数值
这篇文章展示了如何使用栈(包括顺序栈和链栈)实现将十进制数值转换成八进制数值的方法,通过C语言编程演示了两种栈的实现方式和使用场景。
用栈实现将一个十进制数值转换成八进制数值。即用该十进制数值除以8,并保留其余数;重复此操作,直到该十进制数值为0为止。最后将所有的余数反向输出就是所对应的八进制数值
|
5天前
|
存储 网络协议 Linux
用户态协议栈06-TCP三次握手
用户态协议栈06-TCP三次握手