IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> P5—<栈(动态版)>《数据结构(C语言版)》 -> 正文阅读

[数据结构与算法]P5—<栈(动态版)>《数据结构(C语言版)》

目录

《数据结构(C语言版)》实战项目之栈(动态版)的功能实现

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?——By 作者:新晓·故知

一、完整源码:

????????????????完整源码如下,欢迎复制测试指正!

???????栈(动态版)的功能实现(<入栈,出栈>&<顺序,乱序>)测试示例:

? ? ? ?完整源码:

? ? ? ? ?二、栈的功能实现分析:

1.栈的概念及结构:

2.栈的实现方式:

3.栈的实现步骤:

(1)动态结构定义:

(2)栈的初始化:

(3)压栈(入栈):

(4)出栈:

(5)判断栈是否为空:

(6)栈顶查找:

(7)查看栈的数据:

(8)栈的销毁:

栈的辨析:

栈顶top的位置:

后记:●由于作者水平有限,文章难免存在谬误之处,敬请读者斧正,俚语成篇,恳望指教!

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?——By 作者:新晓·故知


《数据结构(C语言版)》实战项目之栈(动态版)的功能实现

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?——By 作者:新晓·故知

一、完整源码:

完整源码如下,欢迎复制测试指正!

栈(动态版)的功能实现(<入栈,出栈>&<顺序,乱序>)测试示例:

完整源码:

Test.c:

#include "Stack.h"
//栈的测试

//按照顺序压栈、出栈
void TestStack1()
{
	ST st;
	StackInit(&st);
	1.一个一个创建数据,可连续也可不连续
	//StackPush(&st, 1);
	//StackPush(&st, 2);
	//StackPush(&st, 3);
	//StackPush(&st, 4);
	//StackPush(&st, 5);
	
	//2.使用循环压栈创建数据
	for (int i = 0; i < 6; ++i)
	{
		StackPush(&st, i);
	}

	while (!StackEmpty(&st))
	{
		printf("%d ", StackTop(&st));
		StackPop(&st);
	}
	printf("\n");

	StackDestroy(&st);
}
//乱序压栈、出栈
void TestStack2()
{
	ST st;
	StackInit(&st);
	//1.一个一个创建数据,可连续也可不连续
	StackPush(&st, 1);
	StackPush(&st, 2);
	StackPush(&st, 3);
	//1、2、3压栈,3出栈,再进行4、5压栈,再打印整体出栈
	printf("%d ", StackTop(&st));
	StackPop(&st);
	StackPush(&st, 4);
	StackPush(&st, 5);


	while (!StackEmpty(&st))
	{
		printf("%d ", StackTop(&st));
		StackPop(&st);
	}
	printf("\n");

	StackDestroy(&st);
}
int main()
{
	TestStack1();
	TestStack2();

	return 0;
}

Stack.c:

#include "Stack.h"
//栈的接口功能函数
//初始化
void StackInit(ST* ps)
{
	assert(ps);
	ps->a = NULL;
	ps->top = 0;
	ps->capacity = 0;

}

//销毁
void StackDestroy(ST* ps)
{
	assert(ps);
	free(ps->a);
	ps->a = NULL;
	ps->capacity = ps->top = 0;
}

//压栈
void StackPush(ST* ps, STDataType x)
{
	assert(ps);
	//需要注意top的位置,取决于如何对top的初始化
	//本程序top的初始化位置为0
	
	//判断是否栈满,栈满即需要扩容
	if (ps->top == ps->capacity)
	{
		int newCapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;
		//此处的4是随机合理给定,无特别规定,*2是合理利用空间
		ps->a = (STDataType*)realloc(ps->a, newCapacity * sizeof(STDataType));
		//relloc给的是总的新空间的大小
		if (ps->a == NULL)
		{
			printf("relloc fail\n");
			exit(-1);
		}
		ps->capacity = newCapacity;
	}
	ps->a[ps->top] = x;
	ps->top++;
}
//出栈
void StackPop(ST* ps)
{
	assert(ps);
	assert(ps->top > 0);
	--ps->top;
}
//判断栈是否为空
bool StackEmpty(ST* ps)
{
	assert(ps);
	写法1
	//if (ps->top > 0)
	//{
	//	return false;
	//}
	//else
	//{
	//	return true;
	//}
	
	//写法2
	return ps->top == 0;
}
//栈顶
STDataType StackTop(ST* ps)
{
	assert(ps);
	assert(ps->top>0);
	return ps->a[ps->top - 1];
}
//查看栈的数据
int StackSize(ST* ps)
{
	assert(ps);
	return ps->top;
}

Stack.h:

#pragma once

#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
#include<assert.h>

//静态(不常用)
//struct Stack
//{
//	int a[N];
//	int top; //栈顶的位置
//};

//动态
typedef int STDataType;

typedef struct Stack
{
	STDataType* a;
	int top; //栈顶的位置
	int capacity; //容量
}ST;

//接口功能函数

//初始化
void StackInit(ST* ps);
//销毁
void StackDestroy(ST* ps);
//压栈
void StackPush(ST* ps, STDataType x);
//出栈
void StackPop(ST* ps);
//判断栈是否为空
bool StackEmpty(ST* ps);
//栈顶
STDataType StackTop(ST* ps);
//查看栈的数据
int StackSize(ST* ps);

二、栈的功能实现分析:

1.栈的概念及结构:

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

2.栈的实现方式:

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

?3.栈的实现步骤:

(1)动态结构定义:

//动态
typedef int STDataType;

typedef struct Stack
{
	STDataType* a;
	int top; //栈顶的位置
	int capacity; //容量
}ST;

(2)栈的初始化:

//栈的接口功能函数
//初始化
void StackInit(ST* ps)
{
	assert(ps);
	ps->a = NULL;
	ps->top = 0;
	ps->capacity = 0;

}

(3)压栈(入栈):

//压栈
void StackPush(ST* ps, STDataType x)
{
	assert(ps);
	//需要注意top的位置,取决于如何对top的初始化
	//本程序top的初始化位置为0
	
	//判断是否栈满,栈满即需要扩容
	if (ps->top == ps->capacity)
	{
		int newCapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;
		//此处的4是随机合理给定,无特别规定,*2是合理利用空间
		ps->a = (STDataType*)realloc(ps->a, newCapacity * sizeof(STDataType));
		//relloc给的是总的新空间的大小
		if (ps->a == NULL)
		{
			printf("relloc fail\n");
			exit(-1);
		}
		ps->capacity = newCapacity;
	}
	ps->a[ps->top] = x;
	ps->top++;
}

(4)出栈:

//出栈
void StackPop(ST* ps)
{
	assert(ps);
	assert(ps->top > 0);
	--ps->top;
}

(5)判断栈是否为空:

//判断栈是否为空
bool StackEmpty(ST* ps)
{
	assert(ps);
	写法1
	//if (ps->top > 0)
	//{
	//	return false;
	//}
	//else
	//{
	//	return true;
	//}
	
	//写法2
	return ps->top == 0;
}

(6)栈顶查找:

//栈顶
STDataType StackTop(ST* ps)
{
	assert(ps);
	assert(ps->top>0);
	return ps->a[ps->top - 1];
}

(7)查看栈的数据:

//查看栈的数据
int StackSize(ST* ps)
{
	assert(ps);
	return ps->top;
}

(8)栈的销毁:

//销毁
void StackDestroy(ST* ps)
{
	assert(ps);
	free(ps->a);
	ps->a = NULL;
	ps->capacity = ps->top = 0;
}

栈的辨析:

栈顶top的位置:

后记:
●由于作者水平有限,文章难免存在谬误之处,敬请读者斧正,俚语成篇,恳望指教!

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?——By 作者:新晓·故知

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-04-01 00:19:45  更:2022-04-01 00:19:54 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 9:34:45-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码