Objective-C 之父 Brad J. Cox 博士去世,享年 77 歲
第二週學習內容
一.棧,佇列,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() 返回最後一個元素
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。