Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【c语言数据结构】栈的详解! 超级详细!(模拟实现,OJ练习题)

【c语言数据结构】栈的详解! 超级详细!(模拟实现,OJ练习题)

作者头像
用户11292525
发布于 2024-09-27 00:20:01
发布于 2024-09-27 00:20:01
14200
代码可运行
举报
文章被收录于专栏:学习学习
运行总次数:0
代码可运行

栈的概念:

栈:像是一种容器,东西只能从一个地方进,一个地方出,且后进先出!这是其和队列(先进先出,像排队一样,先到先得)的本质区别

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

入栈:插入数据在栈顶。

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

栈的模拟实现

Stack.h

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#define _CRT_SECURE_NO_WARNINGS 1
#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<stdbool.h>


//定义栈的结构
typedef int STDataType;
typedef struct Stack
{
    STDataType* arr;
    int capacity;//栈的空间大小
    int top;//栈顶(插入数据和删除数据的位置)
}ST;

//初始化
void STInit(ST* ps);//传的是地址

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

//栈顶-=--如数据、出数据

//栈的入数据操作
void SrackPush(ST* ps, STDataType x);//第二个参数是要插入的数据

//栈的出数据操作
void SrackPop(ST* ps);

//取栈顶元素---循环打印栈顶的数据
STDataType StackTop(ST* ps);//返回值是栈顶的元素

//判断栈是否为空
bool StackEmpty(ST* ps);

//获取栈中有效个数
int STSize(ST* ps);

Stack.c

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#define _CRT_SECURE_NO_WARNINGS 1
#include"Stack.h"
//初始化
void STInit(ST* ps) {
	assert(ps);//看文件是不是传空
	ps->arr = NULL;
	ps->capacity = ps->top = 0;
	//初始的栈顶和栈底都为0(栈为空)
}

//销毁
void STDestory(ST* ps) {
	assert(ps);
	if (ps->arr != NULL) //栈不为空,说明里面有数据占用空间,直接将其释放掉

	{
		free(ps->arr);
	}
	ps->arr = NULL;
	ps->capacity = ps->top = 0;
}

//栈顶-=--如数据、出数据
//入栈要判断空间是否满了(满了就没法加入数据了)
//出栈,取栈顶元素都要判断栈是否为空(空的栈你能取啥玩意啊)

//栈的入数据操作
void SrackPush(ST* ps, STDataType x) {
	assert(ps);

	//先判断空间情况,还能否加入数据!!!!!!!!!!
	if (ps->top == ps->capacity)//空间满了,需要增容
	{
		//一般情况是二倍的增加
		//初始情况下我们的capacity是定义为0的,所以我们不能直接进行乘二的操作
		//我们需要创建一个变量newCapacity
		int newCapacity = ps->capacity == 0 ? 4 : 2 * ps->capacity;
		STDataType* tmp = (STDataType*)realloc(ps->arr, newCapacity * sizeof(STDataType*));
		if (tmp == NULL) {
			perror("realloc fail!");
			exit(1);
		}

		//申请成功,将tmp申请的空间给pa->arr
		ps->arr = tmp;
		ps->capacity = newCapacity;//容量增加
	}

	//到此为止,空间够够的了,可以放入数据了
	//往栈顶添加数据
	ps->arr[ps->top++] = x;
}



//判断栈是否为空
bool StackEmpty(ST* ps) {
	assert(ps);
	//return ps->arr == NULL;这是判断指针是否为空
	return ps->top == 0;
}
	//栈的出数据操作
void SrackPop(ST* ps) {
	assert(ps);
	//要判断是否栈为空!!!不然空栈怎么出数据!
	assert(!StackEmpty(ps));

	//走到这里就说明栈不为空
	--ps->top;//我们只需要将top进行--操作就能进行栈的出数据操作了
}

栈的出数据操作
//void SrackPopError(ST* ps) {
//	assert(ps);
//	return --ps->arr[ps->top];
//}




//取栈顶元素---循环打印栈顶的数据
STDataType StackTop(ST* ps) {
	assert(ps);
	assert(!StackEmpty(ps));//判断当前栈是不是空的,如果是空的话,我们没有什么能取的
	return ps->arr[ps->top-1];//类似数组,最后一个数据是top-1下标
}



//获取栈中有效个数
int STSize(ST* ps) {
	assert(ps);
	return ps->top;
}

栈的相关OJ练习题

有效的括号

思路:

①用指针ps遍历括号字符串

②ps遇到左括号->入栈,ps++继续向下走

ps遇到右括号->在栈顶的左括号比较是否匹配

③两者匹配->出栈,ps++继续向下走,直至全部匹配,返回true

两者不匹配->非有效括号,返回false,栈销毁

代码及解析
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#define _CRT_SECURE_NO_WARNINGS 1
#include"Stack.h"
//定义栈的结构
typedef char STDataType;
typedef struct Stack
{
	STDataType* arr;
	int capacity;//栈的容量
	int top;//栈顶
}ST;

//初始化
void STInit(ST* ps) {
	assert(ps);
	ps->arr = NULL;
	ps->capacity = ps->top = 0;
}
//销毁
void STDestory(ST* ps) {
	assert(ps);
	if (ps->arr)
		free(ps->arr);
	ps->arr = NULL;
	ps->capacity = ps->top = 0;

}

//栈顶-=--如数据、出数据

//栈的入数据操作
void StackPush(ST* ps, STDataType x) {
	assert(ps);
	//判断空间是否已满
	if (ps->capacity == ps->top) {
		int newCapacity = ps->capacity == 0 ? 4 : 2 * (ps->capacity);
		STDataType* tmp = (STDataType*)realloc(ps->arr, newCapacity * sizeof(STDataType*));
		if (tmp == NULL) {
			perror("realloc fail!");
			exit(1);
		}

		ps->arr = tmp;
		ps->capacity = newCapacity;
	}
	ps->arr[ps->top++] = x;
}

//判断栈是否为空
bool StackEmpty(ST* ps) {
	assert(ps);
	return ps->top == 0;
}
//栈的出数据操作
void StackPop(ST* ps) {
	assert(ps);
	//判断数据是否为空
	assert(!StackEmpty(ps));

	--ps->top;
}

//取栈顶元素---循环打印栈顶的数据
STDataType StackTop(ST* ps) {
	assert(ps);
	assert(!StackEmpty(ps));

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



//获取栈中有效个数
int STSize(ST* ps) {
	assert(ps);
	return ps->top;
}

bool isValid(char* s) {
	//创立新的栈
	ST S;
	//初始化
	STInit(&S);

	//取字符指针遍历括号字符串
	char* ps = s;
	while (*ps != '\0') {
		//判断是否是左括号,是->入栈
		if (*ps == '(' || *ps == '[' || *ps == '{') {
			StackPush(&S,*ps);
		}
		else//此时的ps是右括号->比较匹配左括号
		{
			//因为可能拿了左括号没有右括号,得先判断此时栈是否为空
			if (StackEmpty(&S))
				return false;
			//取目前栈顶的左括号保存在ch中,方便比较
			char ch = StackTop(&S);
			//若匹配
			if ((*ps == ')' && ch == '(') || (*ps == ']' && ch == '[') || (*ps == '}' && ch == '{')) {
				//将第一个栈顶左括号出栈
				StackPop(&S);
			}
			else//不匹配,是无效括号,直接返回错误
			{
				STDestory(&S);//返回前记得销毁
				return false;
			}
		}
		ps++;
	}
	bool ret = StackEmpty(&S) == true;//为空->全匹配完了->返回true
	//销毁
	STDestory(&S);
	return ret;
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-09-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
[c语言日寄]数据结构:栈
在计算机科学中,数据结构是组织和存储数据的方式,而栈(Stack)是其中一种非常基础且重要的数据结构。它遵循后进先出(Last In First Out,LIFO)的原则,就像一叠盘子,你只能在最上面添加或移除盘子。本文将深入探讨栈的原理、实现方式以及应用场景,帮助读者更好地理解和运用这一数据结构。
siy2333
2025/05/31
630
栈(用C语言实现)
栈:⼀种特殊的线性表,其只允许在固定的⼀端进行插入和删除元素操作。进行数据插入和删除操作的⼀端称为栈顶,另⼀端称为栈底。栈中的数据元素遵守后进先出 LIFO(Last In First Out)的原则。
用户11290648
2024/09/25
3360
栈(用C语言实现)
【算法与数据结构】栈的实现详解
栈的结构: 使用数组实现栈时,维护一个top指针指向栈顶元素的下一个位置。入栈时将元素添加到数组top位置,并将top加1;出栈时从top位置取元素,并将top减1。 使用链表实现栈时,链表的头结点指向栈顶元素。入栈添加新节点到头结点后面,出栈删除头结点。 所以栈具有后进先出的特性,是一种限定只允许在一端插入和删除的线性数据结构。
学习起来吧
2024/03/10
1390
【算法与数据结构】栈的实现详解
【数据结构】栈详解
在前面我们一起了解的数据结构有顺序表和链表,这次来介绍栈。 与顺序表和链表相同的是,栈也是常见的数据结构。而与前面两种不同的是,它在内存中的存储,接下来让我们一起来学习一下。
zxctscl
2024/01/23
7500
【数据结构】栈详解
【数据结构初阶第十九节】八大排序系列(下篇)—[详细动态图解+代码解析]
假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,r[i]=r[j],且r[i]在r[j]之前,而在排序后的序列中,r[i]仍在r[j]之前,则称这种排序算法是稳定的;否则称为不稳定的。(就是相同的数据排序之后的相对次序保持不变)
云边有个稻草人
2025/03/16
500
【数据结构初阶第十九节】八大排序系列(下篇)—[详细动态图解+代码解析]
《手撕数据结构经典题系列》有效括号问题
有效括号 力扣链接:20. 有效的括号 - 力扣(LeetCode) (leetcode-cn.com) 题目描述: 给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。 有效字符串需满足: 左括号必须用相同类型的右括号闭合。 左括号必须以正确的顺序闭合。 示例: 提示: 1 <= s.length <= 104 s 仅由括号 '()[]{}' 组成 解题思路: 这里我们使用栈来解决(先入后出的性质 ) 在k题时首先得写个栈出来 读取
用户9645905
2022/11/30
2020
《手撕数据结构经典题系列》有效括号问题
【数据结构初阶】栈接口实现及经典OJ题超详解
栈是一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。
fhvyxyci
2024/09/24
1460
【数据结构初阶】栈接口实现及经典OJ题超详解
【数据结构】C语言实现顺序栈(附完整运行代码)
通过第二部分对项目功能的介绍,我们已经对顺序栈的功能有了大致的了解,虽然看似需要实现的功能很多,貌似一时间不知该如何下手,但我们可以分步分模块来分析这个项目的流程,最后再将各部分进行整合,所以大家不用担心,跟着我一步一步分析吧!
修修修也
2024/04/01
5850
【数据结构】C语言实现顺序栈(附完整运行代码)
C语言每日一题(35)有效的括号
给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
对编程一片赤诚的小吴
2024/01/23
1200
C语言每日一题(35)有效的括号
【数据结构】栈的顺序表实现
由于栈是由顺序表实现的,因此当空间不够需要扩容,入栈之后top需要+1为了记录下一个入栈位置。
每天都要进步呀
2023/03/28
2930
【数据结构】栈的顺序表实现
【数据结构】栈和队列
栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。 进行数据插入和删除操作的一端 称为栈顶,另一端称为栈底。 栈中的数据元素遵守后进先出 LIFO ( Last In First Out )的原则。
用户11290673
2024/09/25
780
【数据结构】栈和队列
DS:顺序栈的实现
栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。 压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。 出栈:栈的删除操作叫做出栈。出数据也在栈顶。
小陈在拼命
2024/02/17
1260
DS:顺序栈的实现
手撕数据结构---栈和队列的概念以及实现
栈:⼀种特殊的线性表,其只允许在固定的⼀端进⾏插⼊和删除元素操作。进⾏数据插⼊和删除操作的⼀端称为栈顶,另⼀端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。
Undoom
2024/09/23
950
手撕数据结构---栈和队列的概念以及实现
【数据结构】栈与队列
1前言:顾名思义,栈与队列是两个东西,栈和队列!对的,栈和队列!!,没错,在念一遍,【栈】     和   【队列】!!!但是本质都是差不多的,只不过底层实现的方式不太一样。
用户11367452
2024/11/21
520
【数据结构】栈与队列
【数据结构】栈与队列OJ题(用队列实现栈)(用栈实现队列)
首先我们要知道的是,我们用队列实现栈,要定义和初始化的是什么,用队列实现栈,实则是用队列的属性实现栈的属性,所以我们在这里要定义队列
用户11367452
2024/11/21
920
【数据结构】栈与队列OJ题(用队列实现栈)(用栈实现队列)
【数据结构】——栈和队列的实现(赋源码)
栈:⼀种特殊的线性表,其只允许在固定的⼀端进⾏插入和删除元素操作。进⾏数据插⼊和删除操作的⼀端称为栈顶,另⼀端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。
用户11286421
2024/09/23
1320
【数据结构】——栈和队列的实现(赋源码)
【初阶数据结构】——限定性线性表:栈 和 队列详解(C描述)
写完这几个函数,大家可能会想,有的函数这么简单,一句代码就搞定了,为什么还要封装成一个函数,有必要嘛?
YIN_尹
2024/01/23
2320
【初阶数据结构】——限定性线性表:栈 和 队列详解(C描述)
【c数据结构】队列详解!(模拟实现、OJ练习实操)
概念:只允许在⼀端进⾏插⼊数据操作,在另⼀端进⾏删除数据操作的特殊线性表,队列具有先进先出FIFO(First In First Out)
用户11292525
2024/10/12
1470
【c数据结构】队列详解!(模拟实现、OJ练习实操)
数据结构——栈和队列
我们可以看到数据的插入和删除操作都在固定的一端进行,我们把这固定的一端叫做栈顶 ,另外的一端叫做栈底,这也就是栈这个线性表的特殊之处了。
用户11352420
2024/11/07
1550
数据结构——栈和队列
栈和队列详解
栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。
waves浪游
2024/08/02
960
栈和队列详解
相关推荐
[c语言日寄]数据结构:栈
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验