【数据结构初阶】深度理解 “栈” (附源码)
创始人
2024-11-12 10:40:53
0

hello,又见面了!

目录

1.  栈的概念与结构

2、栈的实现

Stack.h

Stack.c

test.c

3、习题


正文开始——

1.  栈的概念与结构

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

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

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

【图解】

栈的底层结构

内存比较:双向链表比单链表多了一种指针,内存占用就相对多一些;数组和单链表,数组每次都以2倍大小增容,正因如此,无需多次增容,而单链表每次增加数据都要申请空间,删除数据要释放空间,较为繁琐。

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

2、栈的实现

栈里的数据不能被遍历,不能被随机访问。每次取数据只能取栈顶数据

Stack.h

#pragma once #include #include #include #include  //定义栈的结构 typedef int STDataType; typedef struct Stack { 	STDataType* arr; 	int capacity;  //栈的容量 	int top;       //栈顶 }ST;  //初始化 void STInit(ST* ps);  //销毁 void STDestroy(ST* ps);  //入数据 void StackPush(ST* ps, STDataType x);  //出数据 void StackPop(ST* st);  //取栈顶元素 STDataType StackTop(ST* ps);  //判空 bool StackEmpty(ST* ps);  //获取栈中有效的数据个数 int STsize(ST* ps);  

Stack.c

#define _CRT_SECURE_NO_WARNINGS 1 #include"Stack.h"  //初始化 void STInit(ST* ps) { 	assert(ps); 	ps->arr = NULL; 	ps->capacity = ps->top = 0;  //此时栈为空,栈顶=栈底 }  //销毁 void STDestroy(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 file!"); 			exit(1); 		} 		ps->arr = tmp; 		ps->capacity = newCapacity; 	} 	//空间足够 	ps->arr[ps->top++] = x; }  //出数据 void StackPop(ST* ps) { 	assert(ps); 	assert(!StackEmpty(ps));  	ps->top--; }  //判空 bool StackEmpty(ST* ps) { 	assert(ps); 	return ps->top == 0; }  //取栈顶元素 STDataType StackTop(ST* ps) { 	assert(ps); 	assert(!StackEmpty(ps));  	return ps->arr[ps->top - 1]; }  //获取栈中有效的数据个数 int STsize(ST* ps) { 	assert(ps); 	return ps->top; }  

test.c

#define _CRT_SECURE_NO_WARNINGS 1 #include"Stack.h"  void STTest() { 	ST st; 	STInit(&st);  	StackPush(&st,1); 	StackPush(&st,2); 	StackPush(&st,3); 	StackPush(&st,4); 	StackPush(&st,5); 	printf("size:%d\n", STsize(&st)); 	/*StackPop(&st);*/  	//循环出栈,直到栈为空 	while (!StackEmpty(&st)) 	{ 		STDataType data = StackTop(&st); 		printf("%d ", data); 		//出栈 		StackPop(&st); 	} 	printf("size:%d\n", STsize(&st));  	STDestroy(&st); }  int main() { 	STTest(); 	return 0; }

3、习题

【思路】 

 //定义栈的结构 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 STDestroy(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 file!"); 			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]; }  bool isValid(char* s) {     ST st;     STInit(&st);     char* ps=s;     while(*ps!='\0')     {         //左括号,入栈         if(*ps=='('||*ps=='['||*ps=='{')         {             StackPush(&st,*ps);         }         else  //右括号,与栈顶元素判断是否匹配,匹配,出栈,不匹配,返回false         {             if(StackEmpty(&st))             {                 STDestroy(&st);                 return false;             }             char ch=StackTop(&st);             if(*ps==')'&&ch=='('||*ps=='}'&&ch=='{'||*ps==']'&&ch=='[')             {                 StackPop(&st);             }             else             {                 STDestroy(&st);                 return false;             }         }         ps++;     }     bool ret=StackEmpty(&st)==true;     STDestroy(&st);     return ret; }

至此,栈,结束——


完——

最好的安排_曲婉婷_高音质在线试听_最好的安排歌词|歌曲下载_酷狗音乐酷狗音乐为您提供由曲婉婷演唱的高清音质无损最好的安排mp3在线听,听最好的安排,只来酷狗音乐!icon-default.png?t=N7T8https://t3.kugou.com/song.html?id=Ykfb93CQV2

至此结束——

我是云边有个稻草人

期待与你的下一次相遇 !

相关内容

热门资讯

一分钟了解!wepoker底牌... 一分钟了解!wepoker底牌透视脚本(透视)外挂透视辅助一(竟然是真的有挂);1、wepoker底...
一分钟教你!中至余干有挂吗,广... 一分钟教你!中至余干有挂吗,广西老友辅助(详细辅助攻略教程)中至余干有挂吗辅助器中分为三种模型:中至...
教程攻略!爱来510k辅助器,... 教程攻略!爱来510k辅助器,福建兄弟十三水辅助工具(详细辅助可靠技巧)您好,福建兄弟十三水辅助工具...
第4分钟了解!哈糖大菠萝破解器... 第4分钟了解!哈糖大菠萝破解器(透视)外挂透视辅助第4(都是是有挂)1、哈糖大菠萝破解器ai辅助优化...
十分钟了解!wepoker高级... 十分钟了解!wepoker高级辅助(透视)外挂透视辅助十(确实有挂)1、wepoker高级辅助系统规...
实测揭晓!陕麻圈脚本辅助,闲逸... 实测揭晓!陕麻圈脚本辅助,闲逸辅助app下载(详细辅助透明挂教程)是一款可以让一直输的玩家,快速成为...
终于清楚!潮汕汇辅助透视,创思... 终于清楚!潮汕汇辅助透视,创思维透视下载链接(详细辅助透视教程)1、很好的工具软件,可以解锁游戏的创...
6分钟了解!wepoker黑侠... 6分钟了解!wepoker黑侠破解(透视)外挂透视辅助6(好像存在有挂)1)wepoker黑侠破解辅...
2分钟细说!能否雀神挂件怎么安... 2分钟细说!能否雀神挂件怎么安装,决战卡五星辅助器下载(详细辅助wpk教程)决战卡五星辅助器下载辅助...
六分钟了解!wepoker透视... 六分钟了解!wepoker透视功能下载(透视)外挂透视辅助六(好像存在有挂)1、用户打开应用后不用登...