0
点赞
收藏
分享

微信扫一扫

数据结构 ---> 栈区

船长_Kevin 2023-04-06 阅读 66

朋友们, 本期的内容,我们终于开始新的章节了!

呼!!长出一口气!! 哈😊 毕竟链表开博已经很长一段时间了!!

下面让我们进入本期的正题 ---> 栈区

1.那什么是栈呢?

--->:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素的操作。

而进行数据插入与删除操作的一段称之为 栈顶 则另一端称之为 栈底。

类似人类一样,人类会遵循一定的“人学法则”;

而栈同样会遵循一种法则“后进先出”,其实这是它的原理构造而成的!!

为了方便理解与更加形象化,特推出一幅图示 ::>

数据结构 ---> 栈区_栈区

2.那么栈该如何实现呢?

这里只介绍一种最常用,也是最优化的实现 ---->数组栈

下面开始上手代码了(老早就迫不及待了)

头文件 “Stack.h”

#include <stdio.h>
#include <stdlib.h>

typedef int STDataType;

typedef struct Stack
{
  STDataType* a;
  int capcity;
  int top;
}ST;

//初始化
void STInitial(ST* ps);

//销毁
void STDestroy(ST* ps);

//压栈
void STPush(ST* ps, STDataType x);

//出栈
void STPop(ST* ps);

//栈顶元素
STDataType STTop(ST* ps);

//布尔判空
bool STEmpty(ST* ps);

实现环节 “Stack.c”

#include "Stack.h"

//初始化
void STInitial(ST* ps)
{
	ps ->a = (STDataType*)malloc(STDataType);
  if(ps ->a == NULL)
  {
			perror("malloc::fail");
    	return ;
  }
  int capcity = 4;
  int top = 0;		//top = 0 是栈顶元素的下一个位置
  								//top = -1 是栈顶元素的位置
}

//销毁
void STDestroy(ST* ps)
{
	assert(ps);
  assert(!STEmpty(ps));
  free(ps ->a);
  ps ->a = NULL;
  ps ->capcity = 0;
  ps ->top = 0;
}

//压栈
void STPush(ST* ps, STDataType x)
{
	if(ps ->capcity == ps ->top)
  {
    STDataType* tamp = (STDataType*)realloc(ps ->a, sizeof(STDataType) * ps ->capcity * 2);
    if(tamp == NULL)
    {
    	perror("realloc::fail");
      return ;
    }
    
    ps ->a = tamp;
    ps ->capcity *= 2;
  }
  
 // ps ->a[ps ->top] = x;
 // ps ->top++;
  ps ->a[ps ->top++] = x;
}

//出栈
void STPop(ST* ps)
{
	assert(ps);
  assert(!STEmpty(ps));
  
  ps ->top--;
}

//栈顶元素
STDataType STTop(ST* ps)
{
	assert(ps);
  assert(!STEmpty(ps));
  
  return ps ->a[ps ->top - 1];
}

//布尔判空
bool STEmpty(ST* ps)
{
	assert(ps);
	return ps ->top == 0;
}

//栈区元素个数
void STSize(ST* ps)
{
	assert(ps);
  assert(!STEmpty(ps));
  
	return ps ->top;
}

测试环节 “Test.c”

#include "Stack.h"

int main()
{
  ST st;
  
  STInitial(&st);
  
  STPush(&st, 12);
  STPush(&st, 13);
  STPush(&st, 16);
  STPush(&st, 17);
  STPush(&st, 18);
  
  while(!STEmpty(&st))
  {
  	printf("%d ", STTop(&st));
    STop(&st);
  }
  printf("\n");
  
  STDestroy(&st);
	return 0;
}

还是为了方便观感,更好愉悦视觉!!特附上色彩代码

头文件 “Stack.h”

数据结构 ---> 栈区_栈区_02

测试环节 “Test.c”

数据结构 ---> 栈区_栈区_03

实现环节 “Stack.c”

数据结构 ---> 栈区_栈区_04

为方便好友理解与掌控,有一个代码难点,需要说明下 ::>

数据结构 ---> 栈区_栈区_05

这部分代码的难点在于  “ps ->a[ps ->top - 1]

由于前部分 top = 0 代表着栈顶元素的下一个位置,因此入栈过程中,会从这个下一个位置进入!!也是说,栈顶位置不会有任何元素

如此 出栈顶元素的过程中,想要全部出栈区而且不能越界访问!!

那就必须严格控制住最后一个元素出栈区后,立即结束进程!!

举报

相关推荐

0 条评论