【数据结构初阶】深度理解 “栈” (附源码)
创始人
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、辅助器安装包...
为切实保障!皮皮四川麻辣,手机... 为切实保障!皮皮四川麻辣,手机微乐小程序游戏破解器(一贯真的是有下载)-哔哩哔哩在进入手机微乐小程序...
详情透视!wpk控制牌是真的吗... 详情透视!wpk控制牌是真的吗,wpk辅助哪里买,一贯一直总是有辅助技巧(哔哩哔哩)1、免费辅助多个...
现场直击!大菠萝789辅助器下... 现场直击!大菠萝789辅助器下载,牵手游戏辅助器(其实存在有挂)-哔哩哔哩1、任何大菠萝789辅助器...
分享透视!wpk辅助插件,wp... 分享透视!wpk辅助插件,wpk有那种辅助吗,原来存在有辅助攻略(哔哩哔哩)1、点击下载安装,脚本分...
此事引发网友热议!奇迹陕西挂,... 此事引发网友热议!奇迹陕西挂,新超圣正版辅助(一贯存在有神器)-哔哩哔哩1、很好的工具软件,可以解锁...
据公告内容!天天贵阳游戏辅助,... 据公告内容!天天贵阳游戏辅助,微乐自建房辅助工具(其实有挂修改器)-哔哩哔哩一、微乐自建房辅助工具可...
解迷透视!wepoker可以开... 解迷透视!wepoker可以开透视吗,wepoker买钻石有用吗,切实真的是有辅助脚本(哔哩哔哩)1...
反观!川南麻将辅助,新星游辅助... 反观!川南麻将辅助,新星游辅助软件免费版(其实有挂app)-哔哩哔哩1、让任何用户在无需新星游辅助软...
详情透视!hhpoker真的假... 详情透视!hhpoker真的假的,hhpoker必备开挂,切实存在有辅助脚本(哔哩哔哩)在进入软件靠...