当前位置: 首页 > backend >正文

数据结构--栈和队列

链栈

头文件

#ifndef __LINKS_H__
#define __LINKS_H__
#include <stdio.h>
#include <stdlib.h>
typedef struct node
{int data;struct node *next;
}node,*node_p;
//1、创建结点
node_p create_node(int value);
//2、判空
int empty_stack(node_p S);
//3、入栈
void push_stack(node_p *S,int value);
//4、出栈
int pop_stack(node_p *S);#endif

主函数文件

#include "links.h"
int main()
{//申请栈顶指针初始值为NULL//刚申请栈顶指针时,栈中没有元素node_p S = NULL;push_stack(&S,12);push_stack(&S,90);printf("%d\n",pop_stack(&S));push_stack(&S,26);printf("%d\n",pop_stack(&S));printf("%d\n",pop_stack(&S));return 0;
}

功能函数文件

#include "links.h"
//1、创建结点
node_p create_node(int value)
{node_p new = (node_p)malloc(sizeof(node));if(new==NULL){return NULL;}new->next = NULL;new->data = value;return new;
}
//2、判空
int empty_stack(node_p S)
{return S==NULL;
}
//3、入栈
//入栈操作需要修改主函数中栈顶指针的指向
void push_stack(node_p *S,int value)
{//S是一个二级指针,保存主函数内栈顶指针的地址if(S==NULL){return;}//不用判断*S,因为如果*S==NULL说明栈中没有元素node_p new = create_node(value);new->next = *S;  //新结点指向原来的栈顶元素*S = new;   //让主函数中的栈顶指针S指向新的栈顶结点
}
//4、出栈
int pop_stack(node_p *S)
{if(*S==NULL){return -1;}if(empty_stack(*S)){return -2;}int ret = (*S)->data;node_p del = *S;   //先保存栈顶结点*S = (*S)->next;     //让栈顶指针向后指一个结点free(del);   //释放栈顶元素return ret;
}

makefile文件

EXE=link_stack
Objs=$(patsubst %.c,%.o,$(wildcard *.c))
CC=gcc
CFlags=-c -oall:$(EXE)
$(EXE):$(Objs)                                 $(CC) $^ -o $@
%.o:%.c$(CC) $^ $(CFlags) $@
.PHONY:clean
clean:rm *.o $(Objs)
1.什么是计算机的大小端存储

大端存储(Big Endian)
定义:将数据的高位字节存于低地址,低位字节存于高地址,即 “高字节在前”。
类比:类似人类阅读习惯(从左到右读高位),如数字 “1234” 写作 “12 34”。

小端存储(Little Endian)
定义:将数据的低位字节存于低地址,高位字节存于高地址,即 “低字节在前”。
类比:类似逆序存储,如数字 “1234” 写作 “34 12”。如何判断大小端存

维度大端存储(Big Endian)小端存储(Little Endian)
存储顺序高位字节→低位字节(从低地址到高地址)低位字节→高位字节(从低地址到高地址)
逻辑顺序与数据的二进制表示顺序一致与数据的二进制表示顺序相反
典型场景网络协议、PowerPC/MIPS 架构、BMP 文件x86/AMD64 架构、ARM(默认)、PE 文件
访问效率需按字节顺序读取,可能增加处理开销低地址优先访问,符合 CPU 缓存预取策略

2.如何判断大小端存储  

#include <stdio.h>int isLittleEndian() {unsigned int num = 1;  // 0x00000001 (32位整数)unsigned char* ptr = (unsigned char*)&num;  // 指向最低地址字节// 小端:低字节在前 -> 第一个字节是0x01// 大端:高字节在前 -> 第一个字节是0x00return (*ptr == 1);
}int main() {if (isLittleEndian()) {printf("小端存储(低字节在前)\n");} else {printf("大端存储(高字节在前)\n");}return 0;
}

通过将整数的地址强制转换为字符指针,访问第一个字节的值:
原理:

小端存储(如 x86)中,0x00000001 的内存布局为 0x01 0x00 0x00 0x00,最低地址字节是 0x01。
大端存储中,内存布局为 0x00 0x00 0x00 0x01,最低地址字节是 0x00。

3.arr和&arr的区别

arr: 数组首元素的地址,指向第一个元素 arr[0]。
&arr:   整个数组的地址,指向包含 N 个元素的数组。

4.解释数组指针、指针数组、函数指针和指针函数的区别

一、数组指针(指向数组的指针)
定义
指向整个数组的指针,类型为 type (*)[N],其中 N 是数组长度。
二、指针数组(元素为指针的数组)
定义
数组的每个元素都是指针,类型为 type* arr[N],其中 N 是数组长度。
三、函数指针(指向函数的指针)
定义
指向函数的指针,可用于动态调用函数。类型为 return_type (*)(parameter_types)。
四、指针函数(返回指针的函数)
定义
返回值为指针的函数,本质是函数,类型为 type* func(params)。

5. char str[]="hello\O1";printf("strlen(str)");的结果

6

思维导图

http://www.xdnf.cn/news/14565.html

相关文章:

  • Cobbler批量安装流程及具体配置步骤
  • 鸿蒙开发:基于最新API,如何实现组件化运行
  • 如何用K8s+Istio进行云原生开发?
  • mysql8 sql脚本转mysql5.7
  • 【网工】华为配置专题进阶篇①
  • C/C++中的位域(Bit-field)是什么?
  • 【6G技术探索】MCP协议整理分享
  • 黑马python(七)
  • Java 常用类 Time API:现代时间处理的艺术
  • MIT 6.S081 2020 Lab9 File Systems 个人全流程
  • 部署Maven Java Web项目
  • 什么是状态机?状态机入门
  • 【超详细】讯飞智能车PC电脑烧录指南(高级系统部署与恢复)
  • 《深度学习基础与概念》task2/3
  • 编译器、调试器、仿真器:嵌入式开发的“三把刀”深度解析
  • 目标检测相关【清晰易懂】
  • BloodyAD 命令使用详解
  • WinRAR隐藏技能:给压缩包添加注释
  • Mac Mini M4 安装 jdk8 以及 隐藏 设置内的Java菜单
  • Prompt:更好的提示与迭代
  • c++面试题(14)------顺时针打印矩阵
  • VSCode -配置为中文界面
  • Javaweb学习day4——(MVC架构模式)
  • 项目文章 ▏组蛋白乳酸化驱动的B7-H3表达促进肿瘤免疫逃避
  • HashMap相关学习
  • 嵌入式学习笔记C语言阶段--16函数指针
  • UI前端大数据可视化:从设计到实现的完整流程
  • SQL基础语法+运行原理+云端数据库搭建
  • Qwen2.5-VL 是什么?
  • 大模型笔记4:RAG检索增强生成