【数据结构初阶】深度理解 “栈” (附源码)
创始人
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

至此结束——

我是云边有个稻草人

期待与你的下一次相遇 !

相关内容

热门资讯

解密关于开挂!德扑圈多功能真的... 解密关于开挂!德扑圈多功能真的有透视挂-一贯真的有透视1、很好的工具软件,可以解锁游戏的德扑圈辅助插...
记者爆料外挂!微扑克多功能真的... 记者爆料外挂!微扑克多功能真的有透视挂-一贯有透视1、微扑克脚本辅助下载、微扑克免费透视脚本等服务,...
重大通报辅助器!WePoKer... 重大通报辅助器!WePoKer多功能真的有透视挂-其实是有透视进入游戏-大厅左侧-新手福利-激活码辅...
安装程序教程透视挂!wpk多功... 安装程序教程透视挂!wpk多功能真的有透视挂-总是是真的有透视1)wpk有没有挂:进一步探索wpk有...
每日必看教程辅助!德扑之星多功... 每日必看教程辅助!德扑之星多功能真的有透视挂-一直是真的有透视1)德扑之星辅助插件:进一步探索德扑之...
推荐一款辅助!德普之星多功能真... 推荐一款辅助!德普之星多功能真的有透视挂-总是是有透视在进入德普之星软件靠谱后,参与本局比赛的八名玩...
实测揭晓透视器!wepoker... 实测揭晓透视器!wepoker多功能真的有透视挂-竟然是有透视1、wepoker脚本辅助下载、wep...
科技通报辅助器!德扑之星多功能... 科技通报辅助器!德扑之星多功能真的有透视挂-都是存在有透视1、进入到德扑之星是否有挂之后,能看到左侧...
每日必看教程透视挂!WePoK... 每日必看教程透视挂!WePoKer多功能真的有透视挂-切实有透视一、WePoKer可以开透视的定义与...
一分钟揭秘透视器!德扑圈多功能... 一分钟揭秘透视器!德扑圈多功能真的有透视挂-一贯存在有透视该软件可以轻松地帮助玩家将德扑圈外卦神器提...