这是一本包含c++云课堂所有知识点的手册,算法和问题用例题展示。
新手必看!新手必看!新手必看!(重要的事情说三遍)
目录
1级
第一课——cout
/*
C01.L01.程序的基本结构、cout语句
杨彦彬
2024.9.23日作业
(2024.9.23做)
*/
//调用头文件
#include<bits/stdc++.h>
//使用标准名字空间
using namespace std;
//代码主体
int main(){
//输出数字
cout<<25;cout<<endl;
//输出算式
cout<<45+23;cout<<endl;
//输出字符或字符串
cout<<'S';cout<<endl;
cout<<"zifuchuan";cout<<endl;
//输出换行
cout<<endl;
//输出连续输出项
cout<<32<<"1a2b3c"<<' '<<12+21;
//分号标示了一个语句的结束,C++的每一个语句都必须以分号结尾。
//返回值
return 0;
}
第二课——变量与cin
/*
C01.L02.整型变量、赋值语句、cin 语句
杨彦彬
2024.9.24日作业
(1014.9.23做)
*/
#include<bits/stdc++.h>
using namespace std;
int main()
{
//定义变量
int n; //声明一个变量,名字叫做n,n是一个整型变量
//直接赋值
n=10;
/* 可以在声明得时候赋值:int n=10*/
//间接赋值
int m;
m=n;
//自我赋值
n=n*1;
n=n-1;
n=n*10;
//++、--
int x=10,y=10;
x++;//x++ = x=x+1;
y--;//y++ = y=y+1;
//cin输入
int a,b;
cin>>a>>b;
cout<<n<<endl;
cout<<m<<endl;
cout<<x<<endl;
cout<<y<<endl;
cout<<a<<endl;
cout<<b<<endl;
return 0;
}
第三课——计算
/*
C01.L03.整除及求余、数字的提取、顺序结构程序
杨彦彬
2024.9.25日作业
(2024.9.23做)
*/
#include<bits/stdc++.h>
using namespace std;
int main()
{
//整除
cout<<10/2<<" ";
cout<<10/3<<endl;
//取模(a除以b的余数)
cout<<10%2<<" ";
cout<<10%3<<endl<<"———"<<endl;
//提取数字
//例:提取1243的百位数和91754的千位数
cout<<1243/100%10<<" ";
cout<<91754/1000%10<<endl;
/*
按照解决问题的顺序写出相应的语句,
执行时按自上而下的顺序依次执行,
这就是顺序结构,
是最常用的一种程序结构。
*/
return 0;
}
第四课——if语句和bool
/*
C01.L04.if语句、布尔类型、关系表达式
杨彦彬
2024.9.26日作业
(2024.9.23做)
*/
#include<bits/stdc++.h>
using namespace std;
int main()
{
//定义布尔类型变量
bool f;//布尔类型变量的值有且仅有两种可能:true/false
/*
关系表达式:
10>6 值为真
7%3==1 值为假
逻辑表达式:
1==3&&2>1 值为假
1==3||2>1 值为真
1!=2 值为真
*/
//if语句
if(1==3||2>1)
{
cout<<"1==3||2>1值为真"<<endl;
}//单分支
if(1==3&&2>1)
{
cout<<"1==3&&2>1值为真"<<endl;
}
else
{
cout<<"1==3&&2>1值为假"<<endl;
}//双分支
return 0;
}
第五课——if语句嵌套
/*
C01.L05.if语句及其嵌套
杨彦彬
2024.9.27日作业
(2024.9.23做)
*/
#include<bits/stdc++.h>
using namespace std;
int main()
{
/*
if 语句的嵌套是指在 if ... else ... 分支中还存在 if ... else ... 语句,
一般用来解决三种及以上的分支情况。
*/
int a;
cin>>a;
if(a>=60)
{
if(a>=70)
{
if(a>=80)
{
if(a>=90)
{
cout<<"A+";
}
else
{
cout<<"A";
}
}
else
{
cout<<"A-";
}
}
else
{
cout<<"B+";
}
}
else
{
cout<<"B";
}
return 0;
}
第六课——复合语句
/*
C01.L06.复合语句、数值交换、三个数的最值与排序
杨彦彬
2024.9.__日作业
(2024.9.23做)
*/
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n,a=0,b=0,c=0;
cin>>n;
if(n<0)
a=a+2;
b=b+2;
c=c+2;
cout<<a<<" "<<b<<" "<<c<<endl;
a=0,b=0,c=0;
if(n<0)
{
a=a+2;
b=b+2;
c=c+2;
}
cout<<a<<" "<<b<<" "<<c<<endl;
/*
以上两个部分的结果是不一样的,
因为一个加了花括号({}),
代表当条件表达式通过时,
花括号内的程序同时执行。
当 if 和 else 后面有多个要操作的语句时,
要用花括号 {} 括起来,
将几个语句括起来的语句组合称为复合语句。
*/
//数值交换
a=4,b=6;
int t=a;a=b,b=t;
cout<<a<<" "<<b<<endl;
//错误示范:a=b,b=a;
//输出三个数中的最大值
a=6,b=4,c=7;
cout<<"a,b,c中的最大值是:";
if(a>b)
{
if(a>c) cout<<a<<" ";
else cout<<c<<" ";
}
else
{
if(b>c) cout<<b<<" ";
else cout<<c<<" ";
}
return 0;
}
第七课——for语句初识
/*
C01.L07.for语句初识
杨彦彬
2024.9.25做
*/
#include<bits/stdc++.h>
using namespace std;
int main(){
//for语句
for(int i=1;i<=10;i++)
{
cout<<"1";
}
cout<<endl;
//递减型
for(int i=10;i>=1;i--)
{
cout<<"2";
}
cout<<endl;
//初始值与终值非int类型的for语句
for(double i=0.5;i<=5.0;i+=0.5)
{
cout<<"3";
}
return 0;
}
第八课——累加器和累乘器
/*
C01.L08.累加器、累乘器
杨彦彬
2024.9.25做
*/
#include<bits/stdc++.h>
using namespace std;
int s=0;//定义累加器s
int c=1;//定义累乘器c
int main(){
//通过累加器求a+(a+1)+···+(b-1)+b的和
int a,b;
cin>>a>>b;
for(int i=a;i<=b;i++)
{
s+=i;//累加
}
cout<<s<<endl;
//通过累乘器求x*(x+1)*···*(y-1)*y;
int x,y;
cin>>x>>y;
for(int i=x;i<=y;i++)
{
c*=i;
}
cout<<c<<endl;
return 0;
}
第九课——求最值
/*
C01.L09.求最值
通过循环求最值
杨彦彬
2024.9.25做
*/
#include<bits/stdc++.h>
using namespace std;
int maxn=0;
int minn=10001;
int main(){
//求10个1~10000之间的数中的最大值
for(int i=1;i<=10;i++)
{
int t;
cin>>t;
if(t>maxn) maxn=t;
}
cout<<"这10个数中的最大值是:"<<maxn<<endl;
//求10个1~10000之间的数中的最小值
for(int i=1;i<=10;i++)
{
int t;
cin>>t;
if(t<minn) minn=t;
}
cout<<"这10个数中的最小值是:"<<minn<<endl;
return 0;
}
第十课——循环嵌套
/*
C01.L10.双重循环、多重循环程序设计
杨彦彬
2024.9.25做
*/
#include<bits/stdc++.h>
using namespace std;
int main(){
//双重循环
for(int i=1;i<=5;i++)
{
for(int j=1;j<=10;j++)
{
cout<<"# ";
}
cout<<endl<<endl;
}
//三重循环
for(int i=1;i<=4;i++)
{
for(int j=1;j<=3;j++)
{
for(int k=1;k<=2;k++)
{
cout<<i<<" "<<j<<" "<<k<<"\n";
}
}
}
return 0;
}
第十一课——while语句
/*
C01.L11.while循环
杨彦彬
2024.9.25做
*/
#include<bits/stdc++.h>
using namespace std;
int main(){
//while循环
int a;
cin>>a;
while(a!=0)//当a不等于0时继续执行
{
cout<<a%10<<" ";
a=a/2;
}
cout<<endl;
//do-while语句
do
{
cout<<a;
}while(a!=0);
//之所以会输出一个0,是因为do_while语句实现执行后判断。
//所以会先执行一遍输出a,再判断a!=0是否为真。
/*
while和for的区别:
1.while的循环次数是不定的;for的循环次数是一定的。
2.while可以搭配do来写;for不可以。
*/
return 0;
}
第十二课——数据分离
/*
C01.L12.数据分离
杨彦彬
2024.9.25做
*/
#include<bits/stdc++.h>
using namespace std;
int main(){
//输出n的每一位数字
int n;
cin>>n;
while(n!=0)
{
cout<<n%10<<" ";
n=n/10;
}//输出是倒序的
cout<<endl;
//反转数字
cin>>n;
int k=0;
while(n!=0)
{
k=k*10+n%10;
n=n/10;
}
cout<<k;
return 0;
}
2级
第一课——一维数组
/*
C02.L01.一维数组初步认识
杨彦彬
2024.9.25做
*/
#include<bits/stdc++.h>
using namespace std;
//定义一维数组
int a[10];//定义有10个元素的一维数组a
int main(){
//输入
cin>>a[0];
for(int i=1;i<=5;i++)
{
cin>>a[i];
}
cout<<endl;
//输出
cout<<a[0]<<" ";
for(int i=1;i<=5;i++)
{
cout<<a[i]<<" ";
}
cout<<endl;
//赋值
a[0]=10;
for(int i=1;i<=5;i++)
{
a[i]=6-i;
}
cout<<a[0]<<" ";
for(int i=1;i<=5;i++)cout<<a[i]<<" ";
cout<<endl;
/*
注意:数组下标从0开始,
所以一个由10个元素组成的数组,
对应的下标是0~9。
*/
return 0;
}
第二课——一维数组的最值
/*
C02.L02.一维数组最值问题
杨彦彬
2024.9.27做
*/
#include<bits/stdc++.h>
using namespace std;
int a[10];
int main(){
for(int i=1;i<=5;i++)
{
cin>>a[i];
}
//输出最大值
int maxx=-1;
for(int i=1;i<=5;i++)
{
if(a[i]>maxx) maxx=a[i];
}
cout<<"a数组的最大值是:"<<maxx<<endl;
//输出最大值的位置
int maxn=-1,pos=0;
for(int i=1;i<=5;i++)
{
if(a[i]>maxn) maxn=a[i],pos=i;
}
cout<<"a数组的最大值在第 "<<pos<<" 个"<<endl;
return 0;
}
第三课——数组元素的插入、删除和移动
/*
C02.L03.数组元素的移动、插入、删除
杨彦彬
2024.9.27做
*/
#include<bits/stdc++.h>
using namespace std;
int a[10];
int main(){
int n=5;
for(int i=1;i<=n;i++) cin>>a[i];
//将a[k]移到末尾
int k;
cin>>k;
int t=a[k];
for(int i=k;i<n;i++)
{
a[i]=a[i+1];
}
a[n]=t;
for(int i=1;i<=n;i++) cout<<a[i]<<" ";cout<<endl;
//在a[k]到a[k-1]之间插入x;
int x;
cin>>k>>x;
n++;
for(int i=n;i>=k+1;i--)
{
a[i]=a[i-1];
}
a[k]=x;
for(int i=1;i<=n;i++) cout<<a[i]<<" ";cout<<endl;
//删除a[k];
cin>>k;
for(int i=k;i<n;i++)
{
a[i]=a[i+1];
}
n--;
for(int i=1;i<=n;i++) cout<<a[i]<<" ";cout<<endl;
return 0;
}
第四课——选择排序
/*
C02.L04.选择排序
杨彦彬
2024.9.27做
*/
#include<bits/stdc++.h>
using namespace std;
int a[10];
int main(){
int n=5;
for(int i=1;i<=n;i++) cin>>a[i];
//选择排序(从小到大)
for(int i=1;i<n;i++)
{
for(int j=i+1;j<=n;j++)
{
if(a[i]>a[j]) swap(a[i],a[j]);
}
}
for(int i=1;i<=n;i++) cout<<a[i]<<" ";cout<<endl;
return 0;
}
第五课——sort排序
/*
C02.L05.sort函数
杨彦彬
2024.9.30做
*/
bool cmp(int x,int y)
{
return x>y;
}
#include<bits/stdc++.h>
using namespace std;
int a[11];
int main(){
for(int i=1;i<=10;i++)cin>>a[i];
//sort:sort(start,end,排序方法);
//此时是从小到大排序,不需要最后一项
sort(a+1,a+11);
for(int i=1;i<=10;i++)cout<<a[i]<<" ";
cout<<endl;
//从大到小排序
sort(a+1,a+11,cmp);
for(int i=1;i<=10;i++)cout<<a[i]<<" ";
/*
排序方法(从大到小排):
bool cmp(int x,int y)
{
return x>y;
}
*/
return 0;
}
第六课——格式化输入输出和实型变量
/*
C02.L06.实型变量与格式化输入输出
杨彦彬
2024.9.30做
*/
#include<bits/stdc++.h>
using namespace std;
int a;
int main(){
//格式化输入:scanf(格式控制符,地址列表);
scanf("%d",&a);
//格式化输出:printf(格式控制符,输出列表);
printf("%d\n",a);
/*
“%d”叫做格式控制符,
格式控制符代表了输入或输出的“格式说明”,%d表示输入的数据是整数。
scanf和printf的使用方法是一样的,
只不过前者比后者在变量前多了个“&”号,这些变量跟前面的格式控制符是一一顺序对应的。
一些常用格式控制符说明见下表:
格式控制符 说明
%d 整型(-2147483648 ~2147483647)
%lld 长整型(-9223372036854775808 ~ 9223372036854775807)
%f 单精度浮点数
%lf 双精度浮点数
%c 单字符
在格式控制符后+“\n”:换行
在格式控制符后+“ ”:空格
*/
//定义实型变量
double d;
float f;
//输入实型变量
cin>>d>>f;
//输出
cout<<d<<" "<<f;
return 0;
}
第七课——模拟算法
/*
C02.L07.模拟算法
杨彦彬
2024.9.30做
*/
#include<bits/stdc++.h>
using namespace std;
int main(){
/*
所谓模拟法,就是用计算机模拟某个过程,通过改变数学模型的各种参数,
进而观察变更这些参数所引起的过程状态的变化,然后从中得出解答。
模拟题的算法一般都不太复杂,关键是所有条件都不能遗漏并要把条件分析清楚。
解答模拟题通常的步骤是:
(1)认真仔细的读懂题目。模拟题的描述通常都比较详细,篇幅一般都比较长,
应该边阅读边将有关的条件一条条地记录下来,阅读完成后要反复核对,绝对不能有错漏。
(2)建立各个条件之间的关系,最好用一些简明的表格列出。
(3)认真分析这些关系,并建立这些关系的数学模型。
(4)规划各个模块的结构,用相应的语言、逐步求精的方法描述具体的算法。
(5)编写程序,调试并运行。
(6)检查题目给出的样例能否通过。
竞赛题目中一般都会给出输入输出样例,以便检查程序的输入输出格式是否正确,但这些样例往往会比竞赛时评判所用的测试数据简单,所以你不能满足于通过这些样例,还要尽量自拟一些更复杂、更全面的测试数据来检查程序的正确性。经过反复的调试、检查,才算完成该题。
*/
/*例题:
零花钱
题目描述
小明每天都可以从妈妈那里领到零花钱,第 1 天可以领到 1 块钱,第2天可以领到 2 块钱......,第 i 天可以领到 i 块钱,如果小明领到零花钱后,手上的零花钱是 3 的倍数时,小明就会将他手上所有零花钱的三分之一存在妈妈那里(假设小明的零花钱从来不花!)。
第 K 天的时候小明手上有多少零花钱呢?
输入格式
一个整数 K ,K <= 100
输出格式
一个整数,小明手上的零花钱。
*/
int k=0,s=0;
cin>>k;
for(int i=1;i<=k;i++)
{
s=s+i; //第 i 天的零花钱为i元
if(s%3==0) s=s/3*2; //如果手上的零花钱s为3的倍数,存三分之一在妈妈那,自己留三分之二。
}
cout<<s;
return 0;
}
第八课——周期问题
/*
C02.L08.周期问题
杨彦彬
2024.9.30做
*/
#include<bits/stdc++.h>
using namespace std;
int main(){
/*
题目描述
有一列数,按 5、6、2、4、5、6、2、4、... 排列,第 n 个是几?前 n 个数的和是多少 ?( n <= 10000 )
输入格式
一个整数 n ,表示要找的数的位置。( n <= 10000 )
输出格式
2个数
第一个数表示第 n 个数的值
第二个数表示前 n 个数的和
*/
int x[4] = {4,5,6,2};
int s[4] = {0,5,11,13};
int n;
cin>>n;
int a = n/4; //计算有多少个完整的周期
int b = n%4; //最后不够一个完整周期的数字有多少个
cout<< x[b] <<endl;
cout<<a*17 + s[b];
return 0;
}
第九课——递推算法
/*
C02.L09.简单递推
杨彦彬
2024.9.30做
*/
int a[50],k;
#include<bits/stdc++.h>
using namespace std;
int main(){
/*
“递推”是计算机解题的一种常用法。
利用“递推法”解题首先要分析归纳出“递推关系”。
如经典的斐波那契数列问题,用 f(i) 表示第 i 项的值,
则 f(1) = 0 ,f(2) = 1,在 n>2 时,存在递推关系:f(n) = f(n-1) + f(n-2) 。
在递推问题模型中,每个数据项都与它前面的若干个数据项(或后⾯的若⼲个数据项)存在⼀定的关联,
这种关联一般是通过一个“递推关系式”来描述的。
求解问题时,需要从初始的⼀个或若⼲数据项出发,通过递推关系式逐步推进,从而推导计算出最终结果。这种求解问题的⽅法叫“递推法”。其中,初始的若⼲数据项称为“递推边界”。
1.1 解决递推问题有三个重点:
1.建立正确的递推关系式;
2.分析递推关系式的性质;
3.根据递推关系式编程求解。
1.2 顺推和倒推递推法分为 “顺推” 和 “倒推” 两类模型:
1.顺推,就是从问题的边界条件(初始状态)出发,通过递推关系式依次从前往后递推出问题的解;
2.倒推,就是在不知道问题的边界条件(初始状态)下,从问题的最终解(目标状态或某个中间状态)出发,反过来推导问题的初始状态。
*/
//例题:斐波那契数列
/*
题目描述
斐波那契数列是指这样的数列:第一个数和第二个数都是 1 ,接下来每个数都等于前面 2 个数的和。
输入一个正整数 k ,输出斐波那契数列第 k 个数。
输入格式
一个整数 k ( 1 <= k <= 46 )
输出格式
一个整数,表示斐波那契数列第 k 个数的大小。
*/
//int a[50],k;
cin>>k;
a[1]=1,a[2]=1;
for(int i=3;i<=k;i++)
{
a[i]=a[i-1]+a[i-2];
}
cout<<a[k];
return 0;
}
第十课——简单的枚举
/*
C02.L10.简单的枚举
杨彦彬
2024.9.30做
*/
int a[50],k;
#include<bits/stdc++.h>
using namespace std;
int main(){
/*
枚举是一种简单得算法,其实就是试一个数。
例题:
题目描述
鸡兔同笼问题:一个笼子里面有鸡若干只,兔若干只。共有头 n 个,共有腿 m 条。求鸡兔各多少只?
*/
int n,m,f=0;
cin>>n>>m;
for(int i=0;i<=n;i++)//枚举鸡的只数
{
if(i*2+(n-i)*4==m)
{
cout<<"鸡有"<<i<<"只,";
cout<<"兔有"<<n-i<<"只\n";
f=1;
}
}
if(f==0) cout<<"无解";
return 0;
}
第十一课——下标计数
/*
C02.L11.简单的下标计数
杨彦彬
2024.10.10做
*/
int a[10005];
#include<bits/stdc++.h>
using namespace std;
int main(){
/*
下标计数是一种用于计量多种数据各有多少个的算法。
例题:
选票
奥林匹克运动是人类社会的一个罕见的杰作,它将体育运动的多种功能发挥得淋漓尽致,影响力远远超出了体育的范畴,在当代世界的政治、经济、哲学、文化、艺术和新闻媒介等诸多方面产生了一系列不容忽视的影响。奥林匹克运动有一句著名的格言:“更快、更高、更强(Citius, Altius, Fortius)”。迄今为止已经奥运会(夏季)已经举办了32届了,在以往的这些盛会中,出现了众多耀眼的体育明星,有人说喜欢菲尔普斯、有人说喜欢博尔特,也有人说喜欢苏炳添...
现在给每个运动员都编上号,然后大家给自己最喜欢的运动员投票,最后通过将得票最多的推选为最受欢迎的奥运之星。因为全球人数太多了,候选人也非常多,通过人力来统计非常麻烦,请你编写程序帮助将奥运之星统计出来,你能做到吗?
奥运之星选举中,参加投票人数 N ,N <= 100000,参与选举的运动员人数 10000 。
输入格式
第一行只有一个数:N,参加投票的人数。
第二行有 N 个正整数,相邻数用空格隔开,表示这 N 个人的投票情况。
输出格式
得票最多的那个数字,如果有相同得票的,则输出数值较小的那个数。
*/
int n,maxn=0;
cin>>n;
for(int i=1;i<=n;i++)
{
int t;
cin>>t;
if(t>=maxn) maxn=t;
a[t]++;
}
int maxx=-1,ans=0;
for(int i=0;i<=maxn;i++)
{
if(a[i]>maxx) maxx=a[i],ans=i;
}
cout<<ans;
return 0;
}
第十二课——求连续相同的一段数
/*
C02.L12.求连续相同的一段数
杨彦彬
2024.10.10做
*/
int a[10005];
#include<bits/stdc++.h>
using namespace std;
int main(){
/*
求连续相同的一段数,要用到一个计数器变量cnt
例题:
题目描述
FJ 的农场举行了异一场 USA 奶牛奥林匹克竞赛。N ( 1 <= N <= 100,000 ; N 是一个奇数 ) 只奶牛都已经获得了一个整数分数 S ( 0 <= S <= 10,000 )。
FJ 必须统计这些分数以便指导他们。帮帮他吧~~给出一个列表,计算最小值、最大值、中间数、众数。中间值是一个值 M ,至少一半的数 <= M ,至少一半的数 >= M 。众数是指出现次数最多的一个数。FJ 知道分数里面只有一个众数。
输入格式
第 1 行:一个整数 N 。
第 2 ~ N+1 行:每一行有一个整数,是一只奶牛的分数。
输出格式
四个用空格隔开的整数:最小值、最大值、中间数、众数。
*/
int n;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
int maxx=-1,minn=1000001,cnt=1,cm=0,ans=0;
for(int i=1;i<=n;i++)
{
if(a[i]>=maxx) maxx=a[i];
if(a[i]<=minn) minn=a[i];
if(i>1)
{
if(a[i]==a[i-1])
{
cnt++;
}
else
{
if(cnt>=cm) cm=cnt,ans=a[i];
cnt=1;
}
}
}
cout<<minn<<" "<<maxx<<" ";
if(n%2==1) cout<<a[n/2+1]<<" ";
else cout<<(a[n/2]+a[n/2+1])/2<<" ";
cout<<ans<<" ";
return 0;
}
3级
第一课——回文
/*
C03.L01.回文
杨彦彬
2014.10.15做
*/
#include<bits/stdc++.h>
using namespace std;
void t(string ss)
{
cout<<"——————————"<<ss<<"——————————"<<endl;
}
void hws()
{
t("判断回文数");
int n;
cin>>n;
int k=0,a=n;
while(a)
{
k=k*10+a%10;
a=a/10;
}
cout<<n;
if(k!=n) cout<<"不";
cout<<"是回文数。\n";
}
void hwc()
{
t("判断回文字符串");
string s,sames;
cin>>s;
for(int l=0,r=s.size()-1;l<=r;l++,r--)
{
sames[r]=s[l],sames[l]=s[r];
}
bool flag=1;
for(int i=0;i<s.size();i++)
{
if(s[i]!=sames[i]) flag=0;
}
cout<<s;
if(flag==0) cout<<"不";
cout<<"是回文字符串\n";
}
void hwl()
{
t("判断回文数列");
int n;
cin>>n;
int a[n+1];
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
bool flag=1;
for(int l=1,r=n;l<=r;l++,r--)
{
if(a[l]!=a[r]) flag=0;
}
for(int i=1;i<=n;i++)
{
cout<<a[i]<<" ";
}
if(flag==0) cout<<"不";
cout<<"是回文数列";
}
int main(){
hws();
hwc();
hwl();
return 0;
}
第二课——约瑟夫问题
/*
C03.L08.字符串函数(一)
杨彦彬
2014.10.29做
*/
#include<bits/stdc++.h>
using namespace std;
int main(){
/*
背景故事
据说著名犹太历史学家 Josephus 有过以下的故事:
在罗马人占领乔塔帕特后,39 个犹太人与 Josephus 及他的朋友躲到一个洞中,
39个犹太人决定宁愿死也不要被敌人抓到,于是决定了一个自杀方式:
41 个人排成一个圆圈,由第 1 个人开始报数,每报数到第3人该人就必须自杀,
然后再由下一个重新报数,直到所有人都自杀身亡为止。
然而 Josephus 和他的朋友并不想遵从。
首先从一个人开始,越过k-2个人(因为第一个人已经被越过),
并杀掉第 k 个人。接着,再越过 k-1 个人,并杀掉第 k 个人。
这个过程沿着圆圈一直进行,直到最终只剩下一个人留下,
这个人就可以继续活着。
问题是,给定了和,一开始要站在什么地方才能避免被处决。
Josephus要他的朋友先假装遵从,他将朋友与自己安排在第 16 个与第 31 个位置,
于是逃过了这场死亡游戏。
17世纪的法国数学家加斯帕在《数目的游戏问题》中讲了这样一个故事:
15 个教徒和 15 个非教徒在深海上遇险,
必须将一半的人投入海中,其余的人才能幸免于难,于是想了一个办法:
30 个人围成一圆圈,从第一个人开始依次报数,
每数到第九个人就将他扔入大海,如此循环进行直到仅余15个人为止。
问怎样排法,才能使每次投入大海的都是非教徒。
问题分析与算法设计
约瑟夫问题并不难,求解的方法很多;题目的变化形式也很多。这里给出一种实现方法。
题目中 30 个人围成一圈,因而启发我们用一个循环的链来表示,可以使用结构数组来构成一个循环链。结构中有两个成员,其一为指向下一个人的指针,以构成环形的链;其二为该人是否被扔下海的标记,为0表示还在船上。从第一个人开始对还未扔下海的人进行计数,每数到9时,将结构中的标记改为1,表示该人已被扔下海了。这样循环计数直到有15个人被扔下海为止。
约瑟夫问题是个有名的问题:N 个人围成一圈,从第一个开始报数,第 M 个将被杀掉,最后剩下一个,其余人都将被杀掉。例如 N=6,M=5,被杀掉的顺序是:5,4,6,2,3。
分析
由于对于每个人只有死和活两种状态,因此可以用布尔型数组标记每个人的状态,可用true(或者1)表示死,false(或者0)表示活。
开始时每个人都是活的,所以数组初值全部赋为false。
模拟杀人过程,直到所有人都被杀死为止。
*/
//参考代码:
bool a[101]={0};
int n,m,i,f=0,t=0,s=0;
cin>>n>>m;
do // do ... while 这种循环至少执行一次循环体,如果while后面的判断失败则退出循环
{
t++;//逐个枚举圈中的所有位置
if(t>n) t=1;//数组模拟环状,最后一个与第一个相连
if(!a[t]) s++;//第t个位置上有人则报数
if(s==m)//当前报的数是m
{
s=0;//计数器清零
cout<<t<<' ';//输出被杀人编号
a[t]=1;//此处人已死,设置为空
f++;//死亡人数+1
}
}while(f!=n);//直到所有人都被杀死为止
//上述代码仅仅适合于 n 和 m 都比较小的情况,属于入门级的模拟算法。
return 0;
}
第三课——数组双指针移动和有序数组的合并
/*
C03.L03.数组双指针移动和有序数组的合并
杨彦彬
2024.12.25做
^_^浅浅的庆祝一下圣诞节^_^
*/
#include <bits/stdc++.h>
using namespace std;
void t(string ss)
{
cout<<"——————————"<<ss<<"——————————"<<endl;
}
void h()
{
cout<<"\n";
}
void a()
{
t("数组双指针移动");
cout<<"请输入数组元素个数和每个元素:\n";
int n,a[105];
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
for(int i=1,j=n;i<=j;i++,j--)
{
swap(a[i],a[j]);
}
cout<<"翻转后的数组:";
for(int i=1;i<=n;i++)
{
cout<<a[i]<<" ";
}
h();
}
void b()
{
t("有序数组的合并");
int n,m,a[105]={},b[105]={},c[205]={};
int i,j,k,l;
cout<<"请输入两个数组的元素个数和各个元素:\n";
scanf("%d %d",&n,&m);
for(i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
for(i=1;i<=m;i++)
{
scanf("%d",&b[i]);
}
k=1;
for(i=1,j=1;i<=n&&j<=m;k++)
{
if(a[i]<=b[j])
{
c[k]=a[i++];
}
else
{
c[k]=b[j++];
}
}
if(n>m)
{
for(l=i;l<=n;l++,k++)
c[k] = a[l];
}
else
{
for(l=j;l<=m;l++,k++)
c[k] = b[l];
}
for(i=1;i<k;i++)
{
printf("%d ",c[i]);
}
}
int main()
{
a();
b();
return 0;
}
第四课——前缀和入门
/*
C03.L04.前缀和入门
杨彦彬
2024.12.25做
^_^浅浅的庆祝一下圣诞节^_^
*/
#include <bits/stdc++.h>
using namespace std;
void t(string ss)
{
cout<<"——————————"<<ss<<"——————————"<<endl;
}
void a()
{
t("前缀和模版题");
/*
题目描述
输入一个长度为n的整数序列。
接下来再输入 m 个询问,每个询问输入一对 l , r 。
对于每个询问,输出原序列中从第 l 个数到第 r 个数的和。
输入格式
第 1 行包含两个整数 n 和 m 。
第 2 行包含 n 个整数,表示整数数列。
接下来 m 行,每行包含两个整数 l 和 r ,表示一个询问的区间范围。
数据范围
1 ≤ l ≤ r ≤ n
1 ≤ n , m ≤ 100000
−1000 ≤ 数列中元素的值 ≤ 1000
输出格式
共 m 行,每行输出一个询问的结果。
样例
输入数据 1
5 3
2 1 3 6 4
1 2
1 3
2 4
输出数据 1
3
6
10
*/
int n,m,x,l,r,s[100005],i=0;
cin>>n>>m;
while(n--)
{
cin>>x;
i++;
s[i]=s[i-1]+x;
}
while(m--)
{
cin>>l>>r;
cout<<s[r]-s[l-1]<<endl;
}
}
int main()
{
a();
return 0;
}
第五课——前缀和应用
/*
C03.L05.前缀和的应用
杨彦彬
2024.12.25做
^_^浅浅的庆祝一下圣诞节^_^
*/
#include <bits/stdc++.h>
using namespace std;
void t(string ss)
{
cout<<"——————————"<<ss<<"——————————"<<endl;
}
void a()
{
t("前缀和应用题");
/*
题目描述
给出一个长度为 n ( n <= 10^4) 的序列,求连续子段的最大值。
比如说 2 3 -4 5 的最大子段和是 6 。
而 2 3 -6 7 的最大子段和为 7 。
输入格式
第 1 行一个数 n,范围 [1,1000];
第 2 行 n 整数,范围 [-10000,10000];
输出格式
一个整数,最大和。
样例
输入数据 1
7
5 4 3 -15 -12 11 2
输出数据 1
13
*/
int n,x,s[10005],i=0,maxx=0;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>x;
s[i]=s[i-1]+x;
}
for(int i=1;i<=n;i++)
{
for(int j=i;j<=n;j++)
{
maxx=max(maxx,s[j]-s[i-1]);
}
}
cout<<maxx;
}
int main()
{
a();
return 0;
}
第六课——字符与字符数组
/*
C03.L06.字符类型定义、读入、输出、应用
杨彦彬
2014.10.8做
*/
#include<bits/stdc++.h>
using namespace std;
//定义
const char c1='x';//定义字符常量c1 *常量不可改变
char c2,c3;//定义字符变量c2、c3
char c[105];//定义有105个变量的字符数组c
void t(string ss)
{
cout<<"——————————"<<ss<<"——————————"<<endl;
}
void shuru()
{
t("输入");
cin>>c2;
c3=getchar();//若在输入c2后立刻按回车,那么c3将会是换行。
cin.getline(c,10);
}
void shuchu()
{
t("输出");
cout<<"c1="<<c1<<endl;
cout<<"c2="<<c2<<endl;
cout<<"c3="<<c3<<endl;
cout<<"c="<<c<<endl;
}
void fuzhi()
{
t("赋值");
char a='d',b='a'+3,c=100;
cout<<"a="<<a<<","<<"b="<<b<<","<<"c="<<c<<endl;
/*
char letter[5]={'a','e','i','o','u'}; //用字符常量逐个初始化
letter[0]='x'; //用赋值语句逐个元素赋值:
scanf("%s",letter); //用 scanf 读入整个数组
scanf("%c",&letter[0]); //用 scanf 逐个元素读入:
cin >> letter; //用 cin 输入整个数组
cin >> letter[0]; //用 cin 逐个元素输入:
gets(letter); //用 gets 读入整个数组
letter[0]=getchar(); //用 getchar 逐个读入
cout << letter; //用 cout 输出整个数组:
cout << letter[0]; //用 cout 逐个元素输出:
printf("%s",letter);//用 printf 输出整个数组
printf("%c",letter[0]); //用 printf 逐个元素输出
puts(letter); //用 puts 输出整个数组
putchar(letter[0]);//用 putchar 逐个元素输出
*/
}
void shuchuchangdu()
{
char tt[10];
cin>>tt;
cout<<strlen(tt);
}
int main(){
t("先定义");
shuru();
shuchu();
fuzhi();
shuchuchangdu();
return 0;
}
第七课——字符串入门
/*
C03.L07.字符串入门
杨彦彬
2014.12.27做
^_^今天是学校五周年校庆^_^
*/
#include<bits/stdc++.h>
using namespace std;
string s,b;
void t(string ss)
{
cout<<"——————————"<<ss<<"——————————"<<endl;
}
void input()
{
t("输入");
cin>>s;//用cin输入
getchar();
getline(cin,b);//用getline函数读取整行(包括空格)
}
void output()
{
t("输出");
cout<<s<<endl;//直接输出
cout<<s[1];
printf("\n%c\n",s[2]);//scanf只可以输出单个数组元素
}
int main(){
input();
output();
return 0;
}
第八课——字符串函数1
/*
C03.L08.字符串函数(一)
杨彦彬
2014.10.29做
*/
#include<bits/stdc++.h>
using namespace std;
void t(string ss)
{
cout<<"——————————"<<ss<<"——————————"<<endl;
}
void g()
{
cout<<"————————————————————"<<endl;
}
void zj()
{
t("增加或连接");
string s1,s2,s3="";
s1="abcd"; //s2 后面增加 s1
s2+=s1;
cout<<s2<<endl;
s1+=s2;
cout<<s1<<endl;
g();
s1="abcd";
s2="xyz";
s3=s2+"1234"; //连接后给 s1
cout<<s3<<endl;
cout<<s1+"*"+s2<<endl;
}
void cz()
{
t("查找子串");
string a,b;
int k;
cin>>a>>b;
cout<<"从"<<a<<"中查找子串"<<b<<endl;
if(a.find(b)==-1) cout<<"没有找到\n";
cout<<"开始下标是:"<<a.find(b)<<endl;
g();
cin>>a>>b>>k;
cout<<"从"<<a<<"的第"<<k<<"个开始查找子串"<<b<<endl;
if(a.find(b,k)==-1) cout<<"没有找到\n";
else cout<<"开始下标是:"<<a.find(b,k)<<endl;
}
void qzc()
{
t("取子串");
string s;
int i,l;
cin>>s>>i>>l;
cout<<"在字符串"<<s<<"中取从下标为"<<i<<"的位置开始,长度为"<<l<<"的子串\n";
cout<<s.substr(i,l)<<endl;
}
int main(){
zj();
cz();
qzc();
return 0;
}
第九课——getline、erase、insert函数
/*
C03.L09.getline、erase、insert()函数
杨彦彬
2014.12.27做
^_^今天是学校五周年校庆^_^
*/
#include<bits/stdc++.h>
using namespace std;
string s,b;
void t(string ss)
{
cout<<"——————————"<<ss<<"——————————"<<endl;
}
void a1()
{
t("getline函数");
string str;
getline(cin,str);
cout<<str<<endl;
cout<<"请指定结束符:";
char a;
cin>>a;
getline(cin,str,a);
cout<<str<<endl;
}
void a2()
{
t("erase函数");
string str;
int a,b;
cin>>str;
cout<<"请输入开始位置和删除长度:";
cin>>a>>b;
str.erase(a,b);//删除从a开始的b个字符(包括位置a)
cout<<str<<endl;
}
void a3()
{
t("insert函数");
string str;
cin>>str;
int a;
string b;
cout<<"请输入插入位置和要插入的字符串:";
cin>>a>>b;
str.insert(a,b);//在字符串的第a个位置插入b,原字符串的第i位置开始往后挪腾出位置给b。
cout<<str<<endl;
}
int main(){
a1();
a2();
a3();
return 0;
}
4级
第四课——结构体
/*
C04.L10.结构体
杨彦彬
2024.10.10做
*/
//结构体
//2024.9.19 杨彦彬
#include<bits/stdc++.h>
using namespace std;
//定义结构体
struct stu //struct 结构体名
{
int a;
char b;
string s;
//成员1类型 成员名1;
//······
}str,st[4]; //结构体变量
//注意分号
/*
struct 结构体名{
成员表
成员函数
};
结构体名 结构体变量表; 注:同样可以同时定义多个结构体变量
*/
bool cmp(stu x,stu y)
{
return x.a>y.a;
}
int main(){
/* 结构体 */
//赋值
str.a=10,st[0].a=30,st[1].a=10,st[2].a=19,st[3].a=15;
str.b='s',st[0].b='f',st[1].b='d',st[2].b='c',st[3].b='a';
str.s="Hello!",st[0].s="max&min",st[1].s="1423",st[2].s="1a2b3c",st[3].s="abc123";
//输出(调用)
cout<<"str.a的值是"<<str.a<<"\nstr.b的值是"<<str.b<<"\nstr.s的值是"<<str.s<<endl;
//结构体排序——选择排序(按a从小到大排序)
int n=3;
cout<<"————————————————"<<endl;
for(int i=0;i<=n;i++)
{
cout<<st[i].a<<" "<<st[i].b<<" "<<st[i].s<<endl;
}
cout<<endl;
for(int i=0;i<n;i++)
{
for(int j=i+1;j<=n;j++)
{
if(st[i].a>st[j].a) swap(st[i],st[j]);
}
}
for(int i=0;i<=n;i++)
{
cout<<st[i].a<<" "<<st[i].b<<" "<<st[i].s<<endl;
}
cout<<"————————————————"<<endl;
//结构体排序——sort排序(按a从大到小排序)
for(int i=0;i<=n;i++)
{
cout<<st[i].a<<" "<<st[i].b<<" "<<st[i].s<<endl;
}
cout<<endl;
sort(st,st+n+1,cmp);
/*
cmp函数:
bool cmp(stu x,stu y)
{
return x.a>y.a;//前者与后者须保持的条件
//如果符合条件,不用交换;否则,需要交换。
}
*/
for(int i=0;i<=n;i++)
{
cout<<st[i].a<<" "<<st[i].b<<" "<<st[i].s<<endl;
}
cout<<"————————————————"<<endl;
return 0;
}
5级
6级
7级
第一至五课——组合数学(待更)
/*
C07.L01~C07.L05;
杨彦彬
2024.10.14做
*/
#include <bits/stdc++.h>
using namespace std;
void t(string ss)
{
cout<<"——"<<ss<<"——"<<endl;
}
void a1()
{
t("C07.L01.组合数学之鸽巢原理");
int ans;
cout<<"例题1、证明从 { 0,1,2,3...9,10 } 中任意取 7 个元素,则其中必有 2 个元素和等于 10。\n\n";
cout<<" 这题要利用鸽巢原理。\n"<<" 首先,我们要先知道能组成10的有以下5组数:\n"<<"0,10 / 1,9 / 2,8 / 3,7 / 4,6\n";
cout<<" 11个数中选7个数,则要拿走4个数,那么这4个数必然是四组两个数的组合中的其中一个数。\n";
cout<<" 那么取走后,有四组会被拆散,5-4=1(组),最后还剩一组可以组成10。\n\n";
return;
}
void a2()
{
t("C07.L02.组合数学之加法与乘法原理");
cout<<" 1 加法原理\n若具有性质 A 的事件有 m 个,具有性质 B 的事件有 n 个,则具有性质 A 或性质 B 的事件有 m + n 个。\n";
cout<<"例子:例子:从广州到上海可以做飞机,也可以做高铁。广州到上海的航班一共有 10 个,高铁有 7 趟列车。则坐飞机或者高铁从广州到上海有 10 + 7 个可供选择的方案。\n";
cout<<" 2 乘法原理\n若具有性质 A 的事件有 m 个,具有性质 B 的事件有 n 个,则具有性质A及性质B的事件有 m * n 个。\n";
cout<<"例子:从广州到北京有 20 个交通方案,从北京到纽约有 3 个交通方案,则从广州先到北京再到纽约的方案一共有 20 * 3 = 60 个。\n";
cout<<" 3 减法原理\n若具有性质 A 的事件有 m 个,且具有性质A的数必须具有性质 B 和性质 C \n,";
cout<<"那么若具有性质 C 的事件有 n 个,则符合性质 B 的事件有 m-n 个。\n";
cout<<"例子: 从广州到上海要么是做飞机,要么是坐火车,只有这两种方法可以选择。则从广州坐火车到上海的方案 = 从广州到上海的交通方案 排除 从广州坐飞机到上海的方案。\n";
cout<<" 4 除法原理\n(作者不会)\n";
}
int main()
{
a1();
a2();
return 0;
}
第六课——STL之动态数组
/*
C07.L06.STL之动态数组
杨彦彬
2024.10.14做
*/
#include <bits/stdc++.h>
#include <vector>
using namespace std;
void t(string ss)
{
cout<<"——————————"<<ss<<"——————————"<<endl;
}
void dy()
{
t("定义");
vector<int> v;
cout<<"vector<数据类型> 向量名;\n";
}
void srsc()
{
t("输入&输出");
vector<int> v;
int x,y,z;
cin>>x>>y>>z;
v.push_back(x);
v.push_back(y);
v.push_back(z);
cout<<"v[1]="<<v[1]<<" \n";
}
void cd()
{
t("输出长度&清空&判空");
vector<int> v;
v.push_back(4);v.push_back(3);
v.push_back(8);v.push_back(5);v.push_back(7);
cout<<"v的长度是:"<<v.size()<<endl;
cout<<"v现在是否为空:"<<v.empty()<<endl;
v.clear();
cout<<"v现在是否为空:"<<v.empty()<<endl;
}
void sc()
{
t("删除");
vector<int> v;
v.push_back(5);
cout<<"v现在是否为空:"<<v.empty()<<endl;
v.pop_back();
cout<<"v现在是否为空:"<<v.empty()<<endl;
}
/*
a.insert(t1,2)//在数组下标为t1的位置插入一个元素2,其他元素向后移一位
a.erase(t1)//删除第t1个位置的元素,其他元素向前移动一位
a.erase(t1,t2+1)//删除t1~t2区间内的元素,其余元素向前移动
reverse(t1,t2+1)//反转t1~t2区间内的元素
sort(t1,t2+1)//对数组元素从小到大排序
*/
void fw()
{
t("访问整个数组");
vector<int> v;
int n;
cin>>n;
for(int i=1;i<=n;i++)
{
int t;
cin>>t;
v.push_back(t);
}
vector<int>::iterator it;
cout<<"v数组:";
for(it=v.begin();it!=v.end();it++) cout<<*it<<" ";
cout<<"\n";
}
void jh()
{
t("交换两个数组");
vector<int> a,b;
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++)
{
int t;
cin>>t;
a.push_back(t);
}
for(int i=1;i<=m;i++)
{
int t;
cin>>t;
b.push_back(t);
}
vector<int>::iterator it1,it2;
cout<<"a数组:";
for(it1=a.begin();it1!=a.end();it1++) cout<<*it1<<" ";
cout<<"\n";
cout<<"b数组:";
for(it2=b.begin();it2!=b.end();it2++) cout<<*it2<<" ";
cout<<"\n";
a.swap(b);
cout<<"调转后a数组:";
for(it1=a.begin();it1!=a.end();it1++) cout<<*it1<<" ";
cout<<"\n";
cout<<"调转后b数组:";
for(it2=b.begin();it2!=b.end();it2++) cout<<*it2<<" ";
cout<<"\n";
}
void cz()
{
t("插入&删除&排序");
vector<int> v;
for(int i=1;i<=5;i++) v.push_back(i);
cout<<"插入前数组:";
vector<int>::iterator it;
for(it=v.begin();it!=v.end();it++) cout<<*it<<" ";
cout<<"\n";
cout<<"输入n,k:";
int n,k;
cin>>n>>k;
vector<int>::iterator t=v.begin()+n-1;//要将n以迭代器的方式储存
v.insert(t,k);
cout<<"在下标为n的位置插入k后的数组:";
for(it=v.begin();it!=v.end();it++) cout<<*it<<" ";
cout<<"\n";
cout<<"删除前数组:";
for(it=v.begin();it!=v.end();it++) cout<<*it<<" ";
cout<<"\n";
int p;
cout<<"输入p:";
cin>>p;
vector<int>::iterator t1=v.begin()+p-1;//要将p以迭代器的方式储存
v.erase(t1);
cout<<"删除第p个位置的元素后的数组:";
for(it=v.begin();it!=v.end();it++) cout<<*it<<" ";
cout<<"\n";
}
void fz()
{
t("翻转&排序");
vector<int> v;
for(int i=1;i<=5;i++) {int t;cin>>t;v.push_back(t);}
int n,m;
cin>>n>>m;
vector<int>::iterator a=v.begin()+n-1,b=v.begin()+m-1;
cout<<"翻转前数组:";
vector<int>::iterator it;
for(it=v.begin();it!=v.end();it++) cout<<*it<<" ";
cout<<"\n";
reverse(a,b+1);
cout<<"将数组第n个到第k个翻转后的数组:";
for(it=v.begin();it!=v.end();it++) cout<<*it<<" ";
cout<<"\n";
sort(v.begin(),v.end()-1);
cout<<"排序后的数组:";
for(it=v.begin();it!=v.end();it++) cout<<*it<<" ";
cout<<"\n";
}
int main()
{
dy();
srsc();
cd();
sc();
fw();
jh();
cz();
fz();
return 0;
}
第七课——STL之映射
/*
C07.L07.STL之映射
杨彦彬
2024.10.10做
*/
//映射map
#include <bits/stdc++.h>
using namespace std;
map<string,int> mp;
//定义映射:map<键值类型,映射值类型> 映射名;
int main()
{
//赋值
mp["abc"]=2;
mp["asd"]=3,mp["152"]=23;mp["1s2"]=34;
//输出
cout<<mp["abc"];
//迭代器遍历
map<string,int>::iterator it;//声明 迭代器
for(it=mp.begin();it!=mp.end();it++)//输出整个map
{
//->first : 键值
//->second : 映射值
cout<<it->first<<" "<<it->second<<endl;
}
//输出元素个数
cout<<"mp的元素个数:"<<mp.size()<<endl;
//清空map
mp.clear();
//判空
if(mp.empty()) cout<<"mp是空的"<<endl;
else cout<<"mp不是空的"<<endl;
return 0;
}
第九课——STL之栈
/*
C07.L09.STL之栈
杨彦彬
2014.10.10做
*/
#include<bits/stdc++.h>
using namespace std;
void t(string ss)
{
cout<<"——————————"<<ss<<"——————————"<<endl;
}
void dy()
{
t("定义");
stack<int> st;
cout<<"格式: stack < 数据类型 > 栈名"<<endl;
}
void crz()
{
t("入栈&出栈");
stack<int> s;
int a,b,c;
cin>>a>>b>>c;
s.push(a);
s.push(b);
s.push(c);
cout<<"将栈顶元素"<<s.top()<<"出栈"<<endl;
s.pop();
cout<<"出栈后栈顶元素:"<<s.top()<<endl;
}
void pk()
{
t("判空");
stack<int> s;
s.push(3);
cout<<"是否为空:"<<s.empty()<<endl;
s.pop();
cout<<"是否为空:"<<s.empty()<<endl;
}
void lenth()
{
t("输出长度");
stack<int> s;
for(int i=1;i<=5;i++)
{
s.push(i);
}
cout<<"s此时的元素个数:"<<s.size()<<endl;
}
void bl()
{
t("遍历");
stack <int>s;
for(int i=1;i<=5;i++)
{
int t;
cin>>t;
s.push(t);
}
while(!s.empty())
{
cout<<s.top()<<" ";
s.pop();
}
}
int main(){
dy();
crz();//需要输入3个元素
pk();
lenth();
bl();//需要输入5个元素
return 0;
}
第十课——STL之队列
/*
C07.L10.STL之队列
2014.10.10做
*/
#include<bits/stdc++.h>
using namespace std;
void t(string ss)
{
cout<<"——————————"<<ss<<"——————————"<<endl;
}
void dy()
{
t("定义");
queue<int> q;
cout<<"格式: queue < 数据类型 > 队列名"<<endl;
}
void crz()
{
t("入队&出队");
queue<int> q;
int a,b,c;
cin>>a>>b>>c;
q.push(a);
q.push(b);
q.push(c);
cout<<"将队头元素 "<<q.front()<<" 出队"<<endl;
q.pop();
cout<<"出队后队尾元素:"<<q.front()<<endl;
}
void pk()
{
t("判空");
queue<int> q;
q.push(3);
cout<<"是否为空:"<<q.empty()<<endl;
q.pop();
cout<<"是否为空:"<<q.empty()<<endl;
}
void lenth()
{
t("输出长度");
queue<int> q;
for(int i=1;i<=5;i++)
{
q.push(i);
}
cout<<"q此时的元素个数:"<<q.size()<<endl;
}
void bl()
{
t("遍历");
queue<int> q;
for(int i=1;i<=5;i++)
{
int t;
cin>>t;
q.push(t);
}
while(!q.empty())
{
cout<<q.front()<<" ";
q.pop();
}
}
int main(){
cout<<"*";cout<<"以下的是单向队列";cout<<"*\n";
dy();
crz();//需要输入3个元素
pk();
lenth();
bl();//需要输入5个元素
cout<<endl;
cout<<"*以下的是双向队列*";
//未写完
return 0;
}