首页 > 其他分享 >栈学习笔记

栈学习笔记

时间:2024-11-22 23:15:56浏览次数:3  
标签:LinkStack return int top 笔记 学习 ArrayStack stack

顺序栈

arrayStack.h

#pragma once

typedef int Element_t;
#define MaxStackSize	5

// 顺序栈的数据结构定义
typedef struct {
	Element_t data[MaxStackSize];
	int top;
} ArrayStack;

ArrayStack *createArrayStack();		// 为其他模块提供操作栈结构的接口
void releaseArrayStack(ArrayStack *stack);

// 满递增栈
int pushArrayStack(ArrayStack *stack, Element_t e);
/* 弹栈:
 * V1: 把栈数据空间的内容更新,top改变,Element_t getTop();
		void popArrayStack(ArrayStack *stack);
 * V2: 弹栈的时候,先把栈顶元素的值更新给调用者,然后再更新top值
 */
int popArrayStack(ArrayStack *stack, Element_t *e);

arrayStack.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "arrayStack.h"

ArrayStack *createArrayStack() {
	// 1. 堆空间申请
	ArrayStack *stack = malloc(sizeof(ArrayStack));
	if (stack == NULL) {
		printf("malloc failed!\n");
		return NULL;
	}
	// 2. 初始化这个堆空间
	stack->top = -1;
	memset(stack->data, 0, sizeof(stack->data));
	// for (int i = 0; i < MaxStackSize; ++i) {
	// 	stack->data[i] = 0;
	// }
	// 3. 返回首地址
	return stack;
}

void releaseArrayStack(ArrayStack *stack) {
	if (stack) {
		free(stack);
	}
}

int pushArrayStack(ArrayStack *stack, Element_t e) {
	// 1. 考虑该栈可能出现OverFlow
	if (stack->top >= MaxStackSize - 1) {
		printf("OverFlow!\n");
		return -1;
	}
	// 2. 更新栈内空间的值
	++stack->top;
	stack->data[stack->top] = e;
	return 0;
}

int popArrayStack(ArrayStack *stack, Element_t *e) {
	// 1. 考虑栈会出现UnderFlow
	if (stack->top < 0) {
		printf("UnderFlow!\n");
		return -1;
	}
	// 2. 出栈,栈顶元素备份,更新top值
	Element_t x1 = stack->data[stack->top];
	--stack->top;
	// 3. 同时,调用者希望接收到弹出来的元素,将弹出来的栈顶元素更新给调用者
	if (e) {
		*e = x1;
	}
	return 0;
}

链式栈

LinkStack.h

#pragma once

typedef int value_t;
// 链式栈的节点结构
typedef struct _node {
	value_t data;
	struct _node *next;
} node_t;

typedef struct {
	node_t *top;
	int count;
} LinkStack;

LinkStack *createLinkStack();
void releaseLinkStack(LinkStack *stack);

int pushLinkStack(LinkStack *stack, value_t e);
int popLinkStack(LinkStack *stack, value_t *e);

LinkStack.c

#include <stdio.h>
#include <stdlib.h>
#include "linkStack.h"

LinkStack *createLinkStack() {
	LinkStack *stack = malloc(sizeof(LinkStack));
	if (stack == NULL) {
		return NULL;
	}
	stack->count = 0;
	stack->top = NULL;
	return stack;
}

void releaseLinkStack(LinkStack *stack) {
	node_t *tmp;
	if (stack) {
		while (stack->top) {
			tmp = stack->top;
			stack->top = tmp->next;
			free(tmp);
			--stack->count;
		}
		printf("stack count: %d\n", stack->count);
		free(stack);
	}
}

int pushLinkStack(LinkStack *stack, value_t e) {
	node_t *node = malloc(sizeof(node_t));
	if (node == NULL) {
		return -1;
	}

	node->data = e;
	node->next = stack->top;
	stack->top = node;
	++stack->count;
	return 0;
}

int popLinkStack(LinkStack *stack, value_t *e) {
	if (stack->top == NULL) {
		return -1;
	}
	value_t x1 = stack->top->data;
	node_t *tmp = stack->top;
	stack->top = tmp->next;
	free(tmp);
	--stack->count;
	if (e) {
		*e = x1;
	}
	return 0;
}

main.c

#include <stdio.h>
#include "arrayStack.h"
#include "linkStack.h"

void test01() {
	ArrayStack *stack1 = createArrayStack();
	if (stack1 == NULL) {
		return;
	}
	for (int i = 0; i < MaxStackSize; ++i) {
		pushArrayStack(stack1, i + 10);
	}
	printf("push 5 element!\n");
	pushArrayStack(stack1, 300);
	// 弹栈
	Element_t x1;
	for (int i = 0; i < MaxStackSize; ++i) {
		popArrayStack(stack1, &x1);		// scanf("%d", &x1);
		printf("%d\t", x1);
	}
	printf("\npop 5 element!\n");
	popArrayStack(stack1, NULL);

	releaseArrayStack(stack1);
}

void test02() {
	LinkStack *stack2 = createLinkStack();
	if (stack2 == NULL) {
		return;
	}
	for (int i = 0; i < MaxStackSize; ++i) {
		pushLinkStack(stack2, i + 10);
	}
	printf("push 5 element!\n");
	pushLinkStack(stack2, 300);

	value_t x1 = 0;
	int ret = 0;
	// while (popLinkStack(stack2, &x1) != -1) {
	// 	printf("%d\t", x1);
	// }
	// printf("\n");
	releaseLinkStack(stack2);
}

int main() {
	test02();

	return 0;
}

标签:LinkStack,return,int,top,笔记,学习,ArrayStack,stack
From: https://blog.csdn.net/creator_Li/article/details/143984873

相关文章

  • 读书笔记-C#8.0本质论-07
    19.平台互相操作性和不安全代码19.1在托管平台调用非托管代码——P/Invoke模式CLI通过P/Invoke功能对非托管DLL所导出的函数执行API调用。和类的所有普通方法一样,必须在类的上下文中声明目标API,但要为其添加extern修饰符,从而把它声明为外部函数。usingSystem;usingSystem.......
  • 读书笔记-C#8.0本质论-04
    18.多线程18.1多线程基础处理器受限延迟(Processor-boundlatency):假定一个计算需要执行120亿次算术运算,而总共的处理能力是每秒60亿次,那么从请求结果到获得结果至少有2秒钟的处理器受限延迟。I/O受限延迟(IO-boundlatency):从外部来源(磁盘、web服务器等)获取数据所产生......
  • 读书笔记-C#8.0本质论-06
    18.4并行迭代如果一个对CPU资源占用较大的计算可以很容易被分割为多个彼此完全独立的部分以任意顺序执行,则要使用并行循环。示例如下:usingSystem;usingSystem.Collections.Generic;usingSystem.Diagnostics;usingSystem.Threading;usingSystem.Threading.Tasks;name......
  • 读书笔记-C#8.0本质论-05
    18.3基于任务的异步编程模式18.3.1使用任务并行库(TPL)实现异步执行高延迟操作usingSystem;usingSystem.Net.Http;usingSystem.Threading;usingSystem.Threading.Tasks;namespaceConsoleApp1;internalstaticclassProgram{privatestaticvoidMain()......
  • 《潮骚》阅读笔记1
    前两天思政课上让分享文艺作品,突然想起来自己曾经想看的几本三岛文学。今天考完数学分析(期中考试告一段落),就立马跑到图书馆找书。《潮骚》的体量比较小,看纸张也比较陈旧了,上面甚至还有六年前的批注,还挺浪漫。(插句题外话,好想开一家书店,来来往往的行人可以walkinforfree。只希望......
  • Perfetto学习大全
    Perfetto是一个功能强大的性能分析和追踪工具,主要用于捕获和分析复杂系统中的事件和性能数据,特别是在Android和Linux环境下。它的核心目标是帮助开发者深入了解系统和应用程序的运行状态,以便优化性能和诊断问题。Perfetto的主要作用系统性能分析捕获CPU、GPU、内存......
  • vue.js学习(day 5)
     watch侦听器(监视器)<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"/><metahttp-equiv="X-UA-Compatible"content="IE=edge"/><metaname="viewport"......
  • 前端开发调试之移动端调试学习笔记
    一、引言随着移动互联网的飞速发展,移动端页面和应用的开发变得越发重要。而在前端开发移动端项目时,有效的调试手段能帮助我们及时发现并解决诸多问题,确保项目在移动端设备上能够正常运行且提供良好的用户体验。以下就是关于前端开发中移动端调试的详细学习笔记内容。二、常......
  • 人工智能之深度学习基础——反向传播(Backpropagation)
    反向传播(Backpropagation)反向传播是神经网络的核心算法之一,用于通过误差反传调整网络参数,从而最小化损失函数。它是一种基于链式法则的高效梯度计算方法,是训练神经网络的关键步骤。1.反向传播的基本步骤1.1前向传播在前向传播过程中,输入数据从输入层经过隐藏层传递到输出层,......
  • 优化注意力层提升 Transformer 模型效率:通过改进注意力机制降低机器学习成本
    Transformer架构由Vaswani等人在2017年发表的里程碑式论文《AttentionIsAllYouNeed》中首次提出,如今已被广泛认为是过去十年间最具开创性的科学突破之一。注意力机制是Transformer的核心创新,它为人工智能模型提供了一种全新的方法,使模型能够根据具体任务的需求,灵活地聚......