2019/7/10秋招学习笔记

1. 二叉树前中后及层次遍历非递归写法

解释参考:https://blog.csdn.net/z_ryan/article/details/80854233

#include <iostream>
#include <vector>
#include<stack>
#include<queue>

using namespace std;

enum Tag { left, right };

typedef struct node {
	int data;
	struct node* lchild;
	struct node* rchild;
	node(int _data):data(_data),lchild(nullptr),rchild(nullptr) {}
}Node;

typedef struct TagNode {
	Node* node;
	Tag tag;
}TagNode;

//前序遍历,根左右
vector<int> preOrder(Node* root) {
	vector<int> res;
	if (root == nullptr)
		return res;
	stack<Node*> s;
	Node* p = root;
	while (!s.empty() || p) {
		if (p) {
			res.push_back(p->data);
			s.push(p);
			p = p->lchild;
		}
		else {
			p = s.top();
			s.pop();
			p = p->rchild;
		}
	}
	return res;
}
//中序遍历,左根右
vector<int> inOrder(Node* root) {
	vector<int> res;
	if (root == nullptr)
		return res;
	//
	Node* p = root;
	stack<Node*> s;
	while (!s.empty() || p) {
		//找到最右节点
		if(p) {
			s.push(p);
			p = p->lchild;
		}
		else{
			p = s.top();
			s.pop();
			res.push_back(p->data);
			p = p->rchild;
		}
	}
	return res;
}
//后序遍历,左右根
vector<int> postOrder(Node* root) {
	vector<int> res;
	if (root == nullptr)
		return res;
	stack<TagNode> s;
	TagNode tagnode;
	Node* p = root;
	while (!s.empty() || p) {
		while (p) {
			tagnode.node = p;
			tagnode.tag = Tag::left;
			s.push(tagnode);
			p = p->lchild;
		}
		tagnode = s.top();
		s.pop();

		if (tagnode.tag == Tag::left) {
			tagnode.tag = Tag::right;
			s.push(tagnode);
			p = tagnode.node;
			p = p->rchild;
		}
		else {
			res.push_back(tagnode.node->data);
			p = nullptr;
		}
	}
	return res;
}
//二叉树层序遍历
vector<int> level(Node* root) {
	vector<int> res;
	if (root == nullptr)
		return res;
	queue<Node*> q;
	q.push(root);
	while (!q.empty()) {
		Node* node = q.front();
		q.pop();
		//访问nod
		res.push_back(node->data);
		
		if (node->lchild)
			q.push(node->lchild);
		if (node->rchild)
			q.push(node->rchild);
	}
	return res;
}

//输出遍历结果
void visit(vector<int> vec) {
	for (int data : vec) {
		printf("%d  ",data);
	}
	printf("\n");
}

int main() {

	Node pNode0(0),pNode1(1), pNode2(2), pNode3(3), pNode4(4), pNode5(5), pNode6(6);
	pNode0.rchild = &pNode2;
	pNode0.lchild = &pNode1;
	pNode1.lchild = &pNode3;
	pNode1.rchild = &pNode4;
	pNode2.lchild = &pNode5;
	pNode2.rchild = &pNode6;

	//测试
	vector<int> res = level(&pNode0);
	visit(res);

	system("pause");
	return 0;
}

2. 数据库相关

什么是事务:作为单个逻辑工作单元执行的一系列操作,要么完全的执行,要么完全的不执行。
事务是并发控制的基本单位。

事物的四个属性(ACID):

原子性:事务中的操作要么不做,要么全做
隔离性:一个事物的执行不能被其他事物干扰
一致性:一个事务执行之前和执行之后都必须处于一致性状态
持久性:一个事物一旦提交,对数据库的改变是永久的

一般情况下,通过执行COMMIT(提交)或ROLLBACK(回滚)语句来终止事务。

由于并发操作带来的数据不一致性:
  • 更新丢失(两个事务都同时更新一行数据,一个事务对数据的更新把另一个事务对数据的更新覆盖了)
  • 脏读(一个事务读到了另一个事务尚未提交的数据操作结果)
  • 不可重复读(一个事物对同一数据重复读取两次,却得到不同的结果)
    • 虚读:一个事务先后读取同一条记录,但两次读取的数据不同,我们称之为不可重复读。
    • 幻读:一个事务按相同的查询条件重新读取以前检索过的数据,却发现其他事务插入了满足其查询条件的新数据,这种现象就称为幻读。
定义四个隔离级别以避免上面的并发问题:
  • 读未提交(Read Uncommitted):处理更新丢失问题。在一个事务开始写数据的时候,不允许其他事物进行写操作。
  • 读提交(Read Committed):处理更新丢失,脏读。
  • 可重复读取(Repeatable Read):处理更新丢失,脏读,不可重复读。读取数据的事务将会禁止写事务,但允许读事务,写事务则禁止任何其他事务。可通过“共享读锁”和“排他写锁”实现。
  • 序列化(Serializable):提供严格的事务隔离,事务只能一个接一个的执行,不能并发。

可以优先考虑把数据库系统的隔离级别设置为Read Committed,可以避免脏读并且有较好的的并发性能。但是会导致不可重复读,幻读和第二类更新丢失的问题,这些个别场合可以由程序采用悲观锁或乐观锁来控制。

隔离级别脏读不可重复读幻读
读未提交(Read uncommitted)
读已提交(Read committed)X
可重复读(Repeatable read)XX
可串行化(Serializable)XXX
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
基于微信小程序的家政服务预约系统采用PHP语言和微信小程序技术,数据库采用Mysql,运行软件为微信开发者工具。本系统实现了管理员和客户、员工三个角色的功能。管理员的功能为客户管理、员工管理、家政服务管理、服务预约管理、员工风采管理、客户需求管理、接单管理等。客户的功能为查看家政服务进行预约和发布自己的需求以及管理预约信息和接单信息等。员工可以查看预约信息和进行接单。本系统实现了网上预约家政服务的流程化管理,可以帮助工作人员的管理工作和帮助客户查询家政服务的相关信息,改变了客户找家政服务的方式,提高了预约家政服务的效率。 本系统是针对网上预约家政服务开发的工作管理系统,包括到所有的工作内容。可以使网上预约家政服务的工作合理化和流程化。本系统包括手机端设计和电脑端设计,有界面和数据库。本系统的使用角色分为管理员和客户、员工三个身份。管理员可以管理系统里的所有信息。员工可以发布服务信息和查询客户的需求进行接单。客户可以发布需求和预约家政服务以及管理预约信息、接单信息。 本功能可以实现家政服务信息的查询和删除,管理员添加家政服务信息功能填写正确的信息就可以实现家政服务信息的添加,点击家政服务信息管理功能可以看到基于微信小程序的家政服务预约系统里所有家政服务的信息,在添加家政服务信息的界面里需要填写标题信息,当信息填写不正确就会造成家政服务信息添加失败。员工风采信息可以使客户更好的了解员工。员工风采信息管理的流程为,管理员点击员工风采信息管理功能,查看员工风采信息,点击员工风采信息添加功能,输入员工风采信息然后点击提交按钮就可以完成员工风采信息的添加。客户需求信息关系着客户的家政服务预约,管理员可以查询和修改客户需求信息,还可以查看客户需求的添加时间。接单信息属于本系统里的核心数据,管理员可以对接单的信息进行查询。本功能设计的目的可以使家政服务进行及时的安排。管理员可以查询员工信息,可以进行修改删除。 客户可以查看自己的预约和修改自己的资料并发布需求以及管理接单信息等。 在首页里可以看到管理员添加和管理的信息,客户可以在首页里进行家政服务的预约和公司介绍信息的了解。 员工可以查询客户需求进行接单以及管理家政服务信息和留言信息、收藏信息等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值