栈的基础细节(c语言)(全部代码,详细图解):入栈,出栈,获取栈中数据个数,栈顶数据等.....

前言

顺序存储(数组)(含详细图解):(创建,初始化,入栈,出栈,获取栈中数据个数,获取栈顶数据,注销栈)

一.栈的基本概念

1.1栈的基本概念

栈,也被称为堆栈,是一种特殊的线性表,其特点是只允许在一端(称为栈顶Top)进行插入和删除操作,而另一端(称为栈底Bottom)则是固定的,不允许进行插入和删除。这一特性使得栈具有"后进先出"(LIFO, Last In First Out)的操作原则,也就是说最后一个进入栈的元素会被首先删除。
栈的基本操作有两种:进栈(或压栈)和出栈(或退栈)。进栈是将新元素放到栈顶元素的上面,使之成为新的栈顶元素;而出栈则是将栈顶元素删除,使其相邻的元素成为新的栈顶元素。

1.2基本图

线性表和栈都是数据结构的种类,它们之间存在着一定的关联性。线性表是一种数据存储结构,它是一组元素的有限序列,这些元素在逻辑上是线性排列的。而栈则是一种受限的线性表,它只允许在表的一端(称为栈顶Top)进行插入和删除操作,另一端(称为栈底Bottom)则是固定的,不允许进行插入和删除。

尽管栈是一种特殊的线性表,但它们之间存在一些明显的区别。首先,线性表的插入和删除操作可以在任意位置进行(数组),这不会改变元素之间的相对位置;而栈的插入和删除操作只能在栈顶进行,这会改变栈中元素的相对位置。其次,线性表支持全序操作,即可以通过比较元素的大小来确定其相对位置;而栈则不支持全序操作,因为栈的元素进出顺序是按照"后进先出"的原则进行的。

二.构建一个结构体

2.1创建结构体代码

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

2.2创建结构体图解

三.栈初始化

3.1初始化代码

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

3.2栈初始化图解

四. 入栈

4.1入栈代码

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

 4.2入栈图解1

 

  4.2入栈细节图解2

 

五.出栈

5.1出栈代码

void StackPop(ST* ps)
{
	assert(ps);
	assert(!StackEmpty(ps));//判断是否非空
	ps->top--;
}

5.2出栈细节图解

六.获取栈内的个数

6.1获取栈内个数代码

//获取数据个数
int StackSize(ST* ps)
{
	assert(ps);
	return ps->top;
}

 6.2栈内个数图解

七.获取栈顶数据

7.1获取栈顶数据代码

//获取栈顶数据
STDataType StackTop(ST* ps)
{
	assert(ps);
	assert(!StackEmpty(ps));

	return ps->a[ps->top - 1];
}

 7.2获取栈顶数据图解

八.注销栈

8.1注销栈代码

//注销栈
void StackDestroy(ST* ps)
{
	assert(ps);
	free(ps->a);
	ps->a = NULL;
	ps->top = ps->capacity = 0;
}

 8.2注销栈图解

九.检查栈是否为空

9.1检查栈是否为空代码

//返回1是空,返回0是非空
bool StackEmpty(ST* ps)
{
	return ps->top == 0;
}

 9.2检查栈是否为空图解

十.全部代码

10.1全部代码

#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 StackInit(ST* ps);
void StackDestroy(ST* ps);
void StackPush(ST* ps, STDataType x);
void StackPop(ST* ps);
STDataType StackTop(ST* ps);
int StackSize(ST* ps);
bool StackEmpty(ST* ps);



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


//注销栈
void StackDestroy(ST* ps)
{
	assert(ps);
	free(ps->a);
	ps->a = NULL;
	ps->top = ps->capacity = 0;
}

//入栈
void StackPush(ST* ps, STDataType x)
{
	assert(ps);
	if (ps->top == ps->capacity)
	{
		int newcapacity = ps->capacity == 0 ? 4 : 2 * ps->capacity;
		STDataType* tmp = realloc(ps->a, sizeof(STDataType) * newcapacity);
		if (tmp == NULL)
		{
			printf("realloc fail\n");
			exit(-1);
		}
		ps->a = tmp;
		ps->capacity = newcapacity;
	}
	ps->a[ps->top] = x;
	ps->top++;
}

//出栈
void StackPop(ST* ps)
{
	assert(ps);
	assert(!StackEmpty(ps));//判断是否非空
	ps->top--;
}

//获取栈顶数据
STDataType StackTop(ST* ps)
{
	assert(ps);
	assert(!StackEmpty(ps));//判断是否非空

	return ps->a[ps->top - 1];
}

//获取数据个数
int StackSize(ST* ps)
{
	assert(ps);
	return ps->top;
}


//返回1是空,返回0是非空
bool StackEmpty(ST* ps)
{
	return ps->top == 0;
}




void PrintfStack(ST* ps)
{
	for (int i = 0; i < ps->top; i++)
	{
		printf("%d ", ps->a[i]);
	}
	printf("\n");
}

TestStack()
{
	ST st;//创建结构体
	StackInit(&st);//初始化
	StackPush(&st, 3);//插入数据
	StackPush(&st, 8);
	StackPush(&st, 9);
	StackPush(&st, 11);
	StackPush(&st, 34);
	StackPush(&st, 67);

	printf("堆中的数据为:\n");
	PrintfStack(&st);
	printf("\n");

	printf("栈顶的数据为:%d \n", StackTop(&st));
	printf("\n");


	printf("出栈2次,现在的堆顶数据为:");
	StackPop(&st);
	StackPop(&st);
	printf("%d \n", StackTop(&st));
	printf("\n");

	printf("堆中的数据为:\n");
	PrintfStack(&st);
	printf("\n");


	printf("现在堆中的元素个数:%d \n", StackSize(&st));
	printf("\n");
	

	printf("全部出栈:");
	while (!StackEmpty(&st))
	{
		printf("%d ", StackTop(&st));
		StackPop(&st);
	}
	printf("\n");
	printf("\n");
	printf("现在堆中的元素个数:%d \n", StackSize(&st));

	//注销栈
	StackDestroy(&st);



}



int main()
{

	TestStack();
	return 0;
}

 10.2运行结果

   以上就是本期内容,欢迎参考指正,如有不懂,欢迎评论或私信出下期!!! 

  • 8
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
数据结构是计算机科学中非常重要的一门课程,它主要研究数据的组织、存储和管理方式。而和队列是数据结构中非常基础的两种数据结构,它们在程序设计中有着广泛的应用。下面是关于顺序的基本操作介绍: 1. 入栈:将元素压入栈顶,即将元素放入栈顶位置。 2. 出栈:将栈顶元素弹出,即将栈顶元素删除。 3. 读栈顶元素:获取栈顶元素,即获取栈顶位置的元素。 4. 建:初始化一个空。 5. 判断满:当栈中元素个数等于的最大容量时,即为满。 6. 判断空:当栈中没有元素时,即为空。 下面是关于顺序C语言实现: ```c #define MAXSIZE 100 // 定义的最大容量 typedef struct { int data[MAXSIZE]; // 存储栈中元素的数组 int top; // 栈顶指针 } SqStack; // 初始化一个空 void InitStack(SqStack *S) { S->top = -1; } // 判断是否为空 int StackEmpty(SqStack S) { if (S.top == -1) { return 1; } else { return 0; } } // 判断是否为满 int StackFull(SqStack S) { if (S.top == MAXSIZE - 1) { return 1; } else { return 0; } } // 入栈 int Push(SqStack *S, int x) { if (StackFull(*S)) { return 0; // 满,入栈失败 } else { S->top++; S->data[S->top] = x; return 1; // 入栈成功 } } // 出栈 int Pop(SqStack *S, int *x) { if (StackEmpty(*S)) { return 0; // 空,出栈失败 } else { *x = S->data[S->top]; S->top--; return 1; // 出栈成功 } } // 读栈顶元素 int GetTop(SqStack S, int *x) { if (StackEmpty(S)) { return 0; // 空,获取栈顶元素失败 } else { *x = S.data[S.top]; return 1; // 获取栈顶元素成功 } } ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

锻炼²

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

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

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

打赏作者

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

抵扣说明:

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

余额充值