第二周学习报告

一.栈,队列,Stacks,Queues

(一)栈
栈是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。元素遵循先进后出的原则。

#include <iostream>
using namespace std;
const int N=110;
int st[N];
int bottom=0,top=-1;
int n;
int main()
{
	cin>>n;
	while(n--)
	{
		cin>>st[++top];
	}
	while(top>=bottom)
	{
		cout<<st[top--]<<" ";
	}
	return 0;
}

在这里插入图片描述

(二)队列
队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。元素遵循先进先出的原则。

#include <iostream>
using namespace std;
const int N=110;
int st[N];
int front=0,rear=-1;
int n;
int main()
{
	cin>>n;
	while(n--)
	{
		cin>>st[++rear];
	}
	while(rear>=front)
	{
		cout<<st[front++]<<" ";
	}
	return 0;
}

在这里插入图片描述

(三)Stacks
1.empty() 堆栈为空则返回真
2.pop() 移除栈顶元素
3.push() 在栈顶增加元素
4.size() 返回栈中元素数目
5.top() 返回栈顶元素
(四)Queue
1.back() 返回最后一个元素
2.empty() 如果队列空则返回真
3.front() 返回第一个元素
4.pop() 删除第一个元素
5.push() 在末尾加入一个元素
6.size()返回队列中元素的个数

二.二分

1.整数二分

整数二分有两个模板:
(1)分为[l,mid] [mid+1,r] 此时的代码为:

#include <iostream>
using namespace std;
int main()
{
	int l=0,r=9,mid,a[101],x;
	cin>>x;
	for(int i=1;i<=r;i++)
	{
		cin>>a[i];
	}
	while(l<r)
	{
		mid=(l+r)/2;
		if(x<=a[mid])
		{
			r=mid;
		}
		else
		{
			l=mid+1;
		}
	}
	cout<<r<<endl;
	return 0;
}

在这里插入图片描述
2.分为[l,mid-1] [mid.r]此时代码为:

#include <iostream>
using namespace std;
int main()
{
	int l=0,r=9,mid,a[101],x;
	cin>>x;
	for(int i=1;i<=r;i++)
	{
		cin>>a[i];
	}
	while(l<r)
	{
		mid=(l+r+1)/2;//为了防止程序陷入死循环 
		if(x>=a[mid])
		{
			l=mid;
		}
		else
		{
			r=mid-1;
		}
	}
	cout<<l<<endl;
	return 0;
}

在这里插入图片描述

2.小数二分

小数二分与整数二分的差别在于while循环的限制条件不同,实数要用一个特别小的数来表示两者接近,例如1e-8;

三.前缀与差分

(1)一维前缀和
S[i] = a[1] + a[2] + … a[i]
a[l] + … + a[r] = S[r] - S[l - 1]
(2)二维前缀和
S[i, j] = 第i行j列格子左上部分所有元素的和以(x1, y1)为左上角,(x2,y2)为右下角的子矩阵的和为 S[x2, y2] - S[x1 - 1, y2] - S[x2, y1 - 1] + S[x1- 1, y1 - 1]
(3)一维差分
B[i] = a[i] -a[i-1]给区间[l,r]中的每个数加上c:B[l] += c, B[r + 1] -= c
(4)二维差分
给以(x1, y1)为左上角,(x2,y2)为右下角的子矩阵中的所有元素加上c: S[x1, y1] += c, S[x2 + 1, y1] -= c, S[x1, y2 + 1] -= c, S[x2 + 1, y2 + 1] += c

四.位运算

四个运算符
与&,只有x,y都是1的时候,运算结果才是1.其余情况都是0。1&1 = 1,
1&0 = 0;
或|,x,y中只要有一个是1,结果就是1,其余情况0,1|0=1, 0|0=0;
非!, 如果x是0,!x= 1,x是1的话,运算结果是0;
异或^ ,x^y相同是0,不同是1,1 ^ 1 = 0 ,0 ^ 0 = 0, 0 ^ 1 =0;
整型:有符号整型和无符号整型
int 32位二进制
有符号整型:正数: 0负数:1
1:0000000000…01
-1:1000000000…01

100000…111
反码: 011111… 000
补码: 1:如果是正数:正数的补码就等 于原码。100000…111
2:如果是负数:负数的补码就是在反码的基础上加1: 011111… 000 +1=011111… 001
左移: 1<<x 01 10 100 1 2 4 相当于扩大2的倍数。
右移: 1>>x 100 10 01 4 2 1 相当于除以2。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值