中缀表达式转后缀表达式并计算
栈在表达式求值中的应用 表达式求值是程序设计语言中最基本的问题,在中缀表达式中不仅依赖运算符的优先级,而且还要处理括号。后缀表达式的运算符在操作数后面,在后缀表达式中已考虑了运算符的优先级,没有括号,只有操作数和运算符,更符合CPU的运算与处理。 中缀表达式转后缀表达式(手算)中缀表达式A + B * (C - D) - E / F化为后缀表达式采用左优先的原则(没有运算符更高级的一律从左往右进行匹配,保证算法的唯一性)。 在这表达式中先进行( )中进行运算,并将运算符放在操作数后面,得CD-。 此时CD-为一个整体并根据运算符优先级与B*进行运算得BCD-*。 再与A+进行运算,得ABCD-*+,剩下就是- E / F部分,先进行除运算得EF/,再ABCD-*+与EF/进行减运算,得最终结果ABCD-*+EF/-。 中缀表达式转后缀表达式(机算)初始化一个栈,用于保存展示还不能确定运算顺序的运算符。 从左到右处理各个元素,直到末尾。可能遇到三种情况。 遇到操作数。直接加入后缀表达式。 遇到界限符。遇到"("直接入栈:遇到")"则依次弹...
电路-电路模型和电路定律
电路和电路模型 电路是由电路零件、器件经导线连接而成的电通路装置。 电路零件常称为电路部件(例如电阻器、开关、蓄电池等); 电路器件则是由电路部件组成且具有某种功能的产品(如晶体管、集成电路等); 在电路中所产生的电压、电流是在电源的作用下产生的,因此电源又称为激励源或激励;由激励在电路中产生的电压、电流等称为响应。 电路模型电路模型 图片中左侧为简单的实际电路,由若干个干电池和小灯泡组成,右侧为电路模型,反映了将嗲能转换为热能和光能的物理现象;用理想电路元件或它们的组合模拟实际器件就是建立其模型,简称建模。 电流和电压的参考方向 电路理论中将电流(I)、电压(U)、电荷(Q)和磁通(Φ)来进行表示。磁通链用ψ进行表示。电功率和电能量分别用P和W。 在电路分析中,需指定电流或电压的参考方向后才能开始进行分析和计算。 在上图中规定了A到B电流i的方向为A->B,若实际电流方向和参考方向一致,则电流为正值,即i>0;若参考方向和实际方向不一致,即i<0。这样在指定的电流参考方向下,电流值的正负就可以反映除电流的实际方向,如下图所示。 同理,对电路两点...
数据结构-顺序表的相关算法实现
题目1:删除最小值 题目: 从顺序表中删除具有最小值的元素(假设唯一)并由函数返回被删元素的值。空出的位置由最后一个元素填补,若顺序表为空,则显示出错信息并退出运行。 具体实现// 删除顺序表中最小值的元素 bool SqListDeleteMinimun(SqList *L,ElemType *e) { //判断顺序表是否为空 if (L->length == 0) { return false; } // 用于存放最小值 ElemType minValue = *(L->data + 0); // 用于存放最小值的索引 int index = 0; for (size_t i = 0; i < L->length - 1; i++) { if(*(L->data + i) > *(L->data + i + 1)){ minValue = *(L->data + i + 1); index = i+1; } &...
数据结构-线性表的概念与C语言实现
线性表的定义 注:线性表是一个逻辑结构!并不是真正物理意义上的地址相邻,而是在抽象层面的相邻,不要和顺序表搞混! 线性表是具有相同数据类型的n个数据元素的有限序列。除了第一个元素意外,每个元素有且仅有一个直接前驱。除最后一个元素外,每个元素有且仅有一个直接后继。 例:$$设有一个线性表 L=(a_1,a_2,…,a_i,a_{i+1},…,a_n)(a_1到a_n皆为int类型)\此时a_2的直接前驱为a_1,直接后继为a_3,以此类推。$$ 由此,可以得出以下特点: 表中元素的个数有限 表中元素具有逻辑上的顺序性 表中元素的数据类型相同,所占存储空间大小相同 元素都是数据元素,每个元素都是单个元素 线性表是逻辑结构,顺序表和链表指的是存储结构,两者概念不相同。 顺序表的定义与实现顺序表的定义 顺序表是用一组地址连续的存储单元依次存储线性表中的数据元素,使每个元素即在逻辑上相邻也在物理位置上相邻。 顺序表的第一个元素表示顺序表的起始位置,接下来的元素地理位置都是在第一个元素之后,所以可得顺序表的特点是元素的逻辑顺序(即线性表)和物理顺序相同。 例: ...
C语言动态内存管理
动态内存函数为解决动态的开辟内存空间的需求,C语言提供了一个动态内存开辟的函数: void *malloc( size_t size); 这个函数向内存申请一块连续可用的空间,并返回指向这块空间的指针。 开辟成功后会返回指向这片空间的指针。 若失败则会返回NULL指针。 并且提供了void free(void *ptr)来释放不再使用的动态内存空间。 //向内存申请10个整形的空间 int* p = (int*)malloc(10*sizeof(int)); //向内存申请失败打印错误原因 if(p ==NULL){ printf("%s\n",strerror(errno)); } //当动态申请空间不再使用则释放 free(p); p = NULL; 开辟动态数组void *calloc(size_t num,size_t size)会在内存中开辟一个初始全为0的数组。 // 向内存申请10个整形的空间 int *p = (int *)calloc(10, sizeof(int)); // 当动态申请空间不再使用则释放 free(p)...
C语言字符串函数
使用以下所有函数需要引入头文件#include <string.h> strlen()函数size_t strlen(const char *string)传入字符串返回字符串长度,这里size_t == unsigned int所以这里要是直接进行比较将会以无符号数进行比较。 例: // strlen("abc") == 3 strlen("abcef") == 5 (strlen("abc") - strlen("abcef")) == 2 无符号数加减符号位默认为正 if (strlen("abc") - strlen("abcef") > 0) { printf("unsigned");//这条语句将会打印 } else { printf("signed"); } 递归实现strlen()函数int Strlen(const char *str) { //当查询到为\0时结束递归 if (*str == '\0') { return 0; } ...
C语言实现任何类型的冒泡排序
根据qsort函数来实现冒泡排序版本,实现后时间复杂度为O(n^3),仅供练习使用,实际运用效率过于低下。 qsort 函数定义于<stdlib.h>头文件中,主要接收参数: void qsort( void *ptr, [size_t] count, [size_t] size,int (*comp)(const void *, const void *) ); ptr为传入的数组 count为数组的长度 size为类型所占字节大小 comp为一个比较函数,若前一个元素大于后面的元素则返回大于0的数,反之返回小于0的数,相等则返回0。 了解qsort基本参数后就可将要实现的排序通过这些参数为标准来进行设计。 //主要排序函数实现 // base:要排序的数组 sz:数组长度 width:类型所占字节大小 cmp:排序所要传的函数(通过正负来判断大小) void bubble_sort(void *base, int sz, int width, int (*cmp)(void *e1, void *e2)) { for (size_t i =...
C语言指针
指针类型的意义: 1.指针类型决定了指针解引用操作符能访问几个字节: char* p能访问1个字节, int* p 能访问4个字节 2.指针类型决定了指针+1,-1,加的或者减的时几个字节:char* p;p+1,跳过一个字节。int* p; p+1,跳过四个字节。 int a = 0x11223344; char* cp = (char*)&a; int* ip = &a; printf("%p\n",*cp);//00 00 00 44 printf("%p\n",*ip);//11 22 33 44 字符指针在指针类型中将char*称为字符指针。 char a[] = "abcdef"; char* p = a; printf("%s\n",a); //abcdef printf("%s\n",p); //abcdef const char* p1 = "abcdef"; const char* p2 = "abcdef"; if (p1==p2) { printf("相同");//会进行打印,说明p1和p2指向同一块内存空间 &...
数据存储相关
整型内存存储的数据形式计算机中的有符号数(整形,**即首位为符号位,0表示”正”,1表示”负”**)有三种表示方式,即原码,反码和补码。(无符号数的原码反码补码和符号位为正时规则相同。) 当符号位为正时(首位为0)则原码反码补码相同。 当符号位为负时(首位为1)原码将值翻译成二进制形式。 反码原码的符号位不变,其他位依次取反。 补码在反码的基础上+1就可以得到补码。 int a = 4; //4个字节-32bit //转换成二进制 //原码:00000000 00000000 00000000 00000100 //反码:00000000 00000000 00000000 00000100 //补码:00000000 00000000 00000000 00000100 int a = -5; //转换成二进制 //原码:10000000 00000000 00000000 00000101 //反码:11111111 11111111 11111111 11111010 //补码:11111111 11111111 11111111 11111100 对于整形来说:内存...
如何对后端传来的数据进行JSON序列化
引言在传统Web开发领域我们通过ajax请求接收到后端发来的数据时,浏览器都已经帮我们完成了json的序列化,而在Flutter显然是不支持直接显示后端接收到的请求的,如此我们就需要对请求接收到的数据进行序列化,转变成为我们能看懂的东西。这里我主要介绍JSON 和序列化数据 - Flutter 中文文档 - Flutter 中文开发者网站 - Flutter中的三种序列化方式。 直接使用内联序列化JSON数据(这种方式很方便,但是在代码运行前你都无法知道你取的类型是否正确,导致代码很容易出错) 内联序列化JSON数据实现方法很简单,主要依靠Flutter内置的json.decode()函数来对接收到后端的数据进行解码。 先说结论,主要用的就是json.decode(value.toString());,就是将获取到的数据转为字符串后进行json解码。 //发送请求类 这里使用的是dio来进行发请求 就简易的实现发送get请求 import 'package:dio/dio.dart'; class Request{ // 配置实例 static fi...
typeorm使用distinct并有传入值时才进行where搜索
TypeOrm介绍typeorm是一个对象关系映射模式,主要就是为了解决面向对象与关系数据库存在的互不匹配的技术。当然使用typeorm可能有时候不如直接sql语法查询,但是使用orm框架可以更容易写出高内聚低耦合的代码来,主要就是为了减少重复代码的书写。 使用distinct与where配合搜索在一些场景中,typeorm所提供的Repository API并不能满足我们查询的需求,这时候就只有两种方案,一种是直接使用typeorm提供的query()方法直接使用sql语句来进行复杂查询,还有就是使用查询构造器Query Builder来进行查询。 当然,既然我们都用orm框架了,当然是要减少使用sql语句的场景的。 此时这就有个需求,当我们需要查询数据有多条,但我们只需要其中一条,并且他的where的值可能是不存在的,这种场景单纯使用find()是解决不了的,就需要使用Query Builder。 例子:就如这有个User表,结构为: CREATE TABLE `user` ( `id` int NOT NULL AUTO_INCREMENT, `name` varc...
nestjs的模块,控制器,提供者介绍
介绍 本文参考了nestjs官方文档 在使用了用nodejs搭建的koa和express框架后发现使用前端的语法也可以搭建一个不错的后端,而现在又逐渐趋势于用typescript来开发,就发现了nestjs可以很好的支持typescript并进行一个工程化的开发。 新建在开始之前,可以使用nest的脚手架来快速搭建一个nest项目。(确保Node.js(>=10.13.0,v13除外)) npm i -g @nestjs/cli nest new project-name #project-name为项目名,会在当前目录下新建一个nestjs项目 创建时会让你选择用什么作为包管理工具,这里默认使用npm。 等待完成后就可以进入到项目中使用npm run start来运行项目了。(也可以使用npm run start:dev来运行启动热更新。) 文件介绍项目创建后,自动在src生成了一下文件: app.controller.ts app.controller.spec.ts app.module.ts app.service.ts main.ts main...