【数据结构】_栈的结构与实现

news/2025/2/5 22:53:16 标签: 数据结构, 开发语言, c++

目录

1. 栈的相关概念与结构

2. 栈的实现

2.1 栈实现的底层结构选择

2.2 Stack.h

2.3 Stack.c

2.4 Test_Stack.c


1. 栈的相关概念与结构

1、栈:一种特殊的线性表,只允许在固定的一端插入和删除数据;

允许进行数据插入和删除操作的一端称为栈顶,另一端称为栈底;

栈中的元素遵守后进先出LIFO(Last In First Out)的原则;

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

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

2. 栈的实现

2.1 栈实现的底层结构选择

1、若采用数组实现栈,则可将数组头视为栈底,数组尾视为栈顶,出入栈都在数组尾进行操作。

2、若采用单链表实现栈,则将链尾视为栈底,入栈利用头插实现,出栈利用头删实现

(若将链首视为栈底,入栈通过尾插实现,但出栈较为麻烦)

3、若采用双链表实现栈,则无论将哪端视为栈底,出栈、入栈等方法的实现都非常方便;

相较而言,数组、单链表的方式均可较为便利实现栈。相对而言数组的实现效果更优,数组在尾上插入数据的效率高且代价小。采用数组实现栈。

2.2 Stack.h

#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
#include<assert.h>
typedef int STDataType;
typedef struct Stack {
	// 动态开辟数组
	STDataType* a;
	// top表示栈顶元素的下一个元素的下标
	int top;
	int capacity;
}ST;
void STInit(ST* pst);
void STDestory(ST* pst);
// 压栈
void STPush(ST* pst,STDataType x);
// 出栈
void STPop(ST* pst);
// 获取栈顶数据
STDataType STTop(ST* pst);
// 判空
bool STEmpty(ST* pst);
// 获取栈元素个数
int STSize(ST* pst);

2.3 Stack.c

#include"Stack.h"
// 初始化
void STInit(ST* pst) {
	assert(pst);
	pst->a = NULL;
	// top表示栈顶元素的下一个元素的下标
	pst->top = 0;
	// capacity表示栈内元素个数(等价于栈顶元素的下一个元素的下标)
	pst->capacity = 0;
}
// 销毁
void STDestory(ST* pst) {
	assert(pst);
	free(pst->a);
	pst->a = NULL;
	pst->capacity = pst->top = 0;
}
// 压栈
void STPush(ST* pst, STDataType x) {
	assert(pst);
	// 满则扩容
	if (pst->top == pst->capacity) {
		int newCapacity = pst->capacity == 0? 4 : pst->capacity * 2;
		STDataType* tmp = (STDataType*)realloc(pst->a, newCapacity * (sizeof(STDataType)));
		if (tmp == NULL) {
			perror("realloc fail");
			return;
		}
		pst->a = tmp;
		pst->capacity = newCapacity;
	}
	// 入栈数据
	pst->a[pst->top] = x;
	pst->top++;
}
// 出栈
void STPop(ST* pst) {
	assert(pst);
	// 判栈非空
	assert(pst->top>0);
	pst->top--;
}
// 获取栈顶数据
STDataType STTop(ST* pst) {
	assert(pst);
	assert(pst->top>0);
	return pst->a[pst->top - 1];
}
// 判空
bool STEmpty(ST* pst) {
	if (pst->top == 0) {
		return true;
	}
	return false;
	//return pst->top == 0;
}
// 获取栈元素个数
int STSize(ST* pst) {
	assert(pst);
	return pst->top;
}

2.4 Test_Stack.c

#include"Stack.h"
int main() {
	ST st;
	STInit(&st);
	STPush(&st, 1);
	STPush(&st, 2);
	STPush(&st, 3);
	STPush(&st, 4);
	while (!STEmpty(&st)) {
		printf("%d ", STTop(&st));
		STPop(&st);
	}
	STDestory(&st);
	return 0;
}

注:在使用数组实现栈的方式中,定义栈时的top表示栈顶位置,关于top的具体含义与初始化、销毁、压栈、出栈等操作需要进行对应:

若top表示栈顶元素的下标,则初始化时(栈内无元素),top=-1,插入时在a[top++]处入栈元素;

若top表示栈顶元素的下一个元素的下标,则初始化时top为0,插入时在a[top]处入栈元素

(易有top表示栈顶元素下标,但将top初始化为0的错误写法,注意勿混淆)


http://www.niftyadmin.cn/n/5842450.html

相关文章

[LeetCode]day13 19.删除链表的倒数第n个结点

19. 删除链表的倒数第 N 个结点 - 力扣&#xff08;LeetCode&#xff09; 题目描述 给你一个链表&#xff0c;删除链表的倒数第 n 个结点&#xff0c;并且返回链表的头结点。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5], n 2 输出&#xff1a;[1,2,3,5]示例 2&a…

pytorch线性回归模型预测房价例子

人工智能例子汇总&#xff1a;AI常见的算法和例子-CSDN博客 import torch import torch.nn as nn import torch.optim as optim import numpy as np# 1. 创建线性回归模型类 class LinearRegressionModel(nn.Module):def __init__(self):super(LinearRegressionModel, self).…

为AI聊天工具添加一个知识系统 之86 详细设计之27 数据处理:ETL

本文要点 ETL 数据提取 作为 数据项目的起点。数据的整个三部曲--里程碑式的发展进程&#xff1a; ETL : 1分形 Type()-层次Broker / 2完形 Method() - 维度Delegate /3 整形 Class() - 容器 Agent 1变象。变象 脸谱Extractor - 缠度&#xff08;物理 皮肤缠度&#xf…

04树 + 堆 + 优先队列 + 图(D1_树(D17_综合刷题练习))

目录 1. 二叉树的前序遍历&#xff08;简单&#xff09; 1.1. 题目描述 1.2. 解题思路 方法一&#xff1a;递归&#xff08;推荐使用&#xff09; 方法二&#xff1a;非递归&#xff08;扩展思路&#xff09; 2. 二叉树的中序遍历&#xff08;中等&#xff09; 2.1. 题目…

2025_1_31 C语言中关于数组和指针

1.数组作为指针传递 数组作为指针传递可以&#xff1a; 加一个数减一个数两个指针相减自增自减 int main() {int arr[] { 1,2,3,4,5,6,7,8,9 };printf("%d\n", arr[0] 2);printf("%d\n", arr[2] - 2);printf("%d\n", arr[0] arr[2]);int* …

Spring Security(maven项目) 3.0.3.0版本

前言&#xff1a; 通过实践而发现真理&#xff0c;又通过实践而证实真理和发展真理。从感性认识而能动地发展到理性认识&#xff0c;又从理性认识而能动地指导革命实践&#xff0c;改造主观世界和客观世界。实践、认识、再实践、再认识&#xff0c;这种形式&#xff0c;循环往…

Linux进程状态及其转换

在Linux系统中&#xff0c;进程是操作系统进行资源分配和调度的基本单位。每个进程在执行过程中会经历不同的状态&#xff0c;这些状态反映了进程当前的活动情况。通过top命令&#xff0c;我们可以实时查看系统中各个进程的状态。理解这些状态及其转换关系&#xff0c;对于系统…

基于RLS的自适应滤波器设计与Matlab实现

引言 自适应滤波器在信号处理领域具有重要应用&#xff0c;包括系统辨识、噪声消除和信道均衡等。递归最小二乘&#xff08;RLS&#xff09;算法因其快速收敛特性成为经典自适应算法之一。本文详细介绍RLS算法原理&#xff0c;并给出Matlab实现示例。 一、RLS算法原理 1.1 算…