数据结构-栈的实现

简介: 数据结构-栈的实现

1.栈的概念及结构

栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。

压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。

出栈:栈的删除操作叫做出栈。出数据也在栈顶。

2.栈的实现

栈的实现一般可以使用数组或者链表实现,相对而言数组的结构实现更优一些。因为数组在尾上插入数据的代价比较小。

2.1定义一个动态栈

1. typedef int STDataType;
2. 
3. typedef struct Stack
4. {
5.  STDataType* a;
6.  int top;
7.  int capacity;
8. }ST;

2.2栈的初始化

1. void STInit(ST* ps)
2. {
3.  assert(ps);
4.  ps->a = NULL;
5.  ps->top = 0;
6.  ps->capacity = 0;
7. 
8. }

2.3栈的销毁

1. void STDestroy(ST* ps)
2. {
3.  assert(ps);
4.  free(ps->a);
5.  ps->a = NULL;
6.  ps->top = ps->capacity = 0;
7. }

2.4数据进栈

数据进栈的话首先要考虑一下是否需要扩容,所以先判断一下top是否等于capacity,如果满了的话再判断一下capacity是否是第一次扩容,如果是的话则扩容至4,不是的话则扩2倍,再对空间进行扩容,这里巧妙地利用了realloc这个库函数,因为如果需要扩容的这个空间是0,则相当于是malloc,扩容完之后就将数据放进top这个位置,然后再将top++,这样才会使得top一直是栈顶元素的下一个位置。

void STPush(ST* ps, STDataType x)
{
  assert(ps);
  if (ps->top == ps->capacity)
  {
    int newCapacity = ps->capacity == 0 ? 4:ps->capacity * 2;
    STDataType* tmp = (STDataType*) realloc(ps->a, sizeof(STDataType) * newCapacity);
    if (tmp == NULL)
    {
      perror("realloc fail");
      exit(-1);
    }
    ps->a = tmp;
    ps->capacity = newCapacity;
   }
  ps->a[ps->top] = x;
  ps->top++;
}

2.5数据出栈

先保证这个栈不是空的,top>0才有数据可以出。出栈直接top--就行了。

1. void STPop(ST* ps, STDataType x)
2. {
3.  assert(ps);
4.  //空
5.  assert(ps->top > 0);
6.  --ps->top;
7. }

2.6栈的数据个数

1. int STSize(ST* ps)
2. {
3.  assert(ps);
4.  return ps->top;
5. }

2.7判断栈是否为空

1. bool STEmpty(ST* ps)
2. {
3.  assert(ps);
4.  return ps->top == 0;
5. }

2.8获取栈顶元素

这里需要注意一下,栈顶元素的位置是top-1.

1. STDataType STTop(ST* ps)
2. {
3.  assert(ps);
4.  assert(ps->top > 0);
5.  return ps->a[ps->top - 1];
6. }

完整代码

Stack.h:

#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<stdbool.h>
typedef int STDataType;
typedef struct Stack
{
  STDataType* a;
  int top;
  int capacity;
}ST;
void STInit(ST* ps);
void STDestroy(ST* ps);
void STPush(ST* ps,STDataType x);
void STPop(ST* ps);
int STSize(ST* ps);
bool STEmpty(ST* ps);
STDataType STTop(ST* ps);

Stack.c:

void STInit(ST* ps)
{
  assert(ps);
  ps->a = NULL;
  ps->top = 0;
  ps->capacity = 0;
}
void STDestroy(ST* ps)
{
  assert(ps);
  free(ps->a);
  ps->a = NULL;
  ps->top = ps->capacity = 0;
}
void STPush(ST* ps, STDataType x)
{
  assert(ps);
  if (ps->top == ps->capacity)
  {
    int newCapacity = ps->capacity == 0 ? 4:ps->capacity * 2;
    STDataType* tmp = (STDataType*) realloc(ps->a, sizeof(STDataType) * newCapacity);
    if (tmp == NULL)
    {
      perror("realloc fail");
      exit(-1);
    }
    ps->a = tmp;
    ps->capacity = newCapacity;
   }
  ps->a[ps->top] = x;
  ps->top++;
}
void STPop(ST* ps, STDataType x)
{
  assert(ps);
  //空
  assert(ps->top > 0);
  --ps->top;
}
int STSize(ST* ps)
{
  assert(ps);
  return ps->top;
}
bool STEmpty(ST* ps)
{
  assert(ps);
  return ps->top == 0;
}
STDataType STTop(ST* ps)
{
  assert(ps);
  assert(ps->top > 0);
  return ps->a[ps->top - 1];
}
相关文章
|
7天前
|
机器学习/深度学习 算法 测试技术
【单调栈】3113. 边界元素是最大值的子数组数目
【单调栈】3113. 边界元素是最大值的子数组数目
|
1天前
|
存储 NoSQL C语言
数据结构——顺序栈与链式栈的实现-2
数据结构——顺序栈与链式栈的实现
数据结构——顺序栈与链式栈的实现-2
|
1天前
|
存储 C语言
数据结构——顺序栈与链式栈的实现-1
数据结构——顺序栈与链式栈的实现
数据结构——顺序栈与链式栈的实现-1
|
5天前
栈的基本应用
栈的基本应用
11 3
|
5天前
栈与队列理解
栈与队列理解
12 1
|
5天前
|
存储 算法
数据结构与算法 栈与队列
数据结构与算法 栈与队列
11 0
数据结构与算法 栈与队列
|
5天前
|
C++
数据结构(共享栈
数据结构(共享栈
6 0
|
5天前
|
C++
数据结构(顺序栈
数据结构(顺序栈
12 2
|
6天前
|
容器
【栈与队列】栈与队列的相互转换OJ题
栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。
10 0
|
6天前
|
存储
【栈】基于顺序表的栈功能实现
栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端 称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。
13 0