数组
数组是啥?
数组是干嘛的?
数组怎么用?
不管咋样,先看百科了解亿下:
C++ 数组 —— 菜鸟教程
C++ 支持数组数据结构,它可以存储一个固定大小的相同类型元素的顺序集合。数组是用来存储一系列数据,但它往往被认为是一系列相同类型的变量。
数组的声明并不是声明一个个单独的变量,比如 number0、number1、…、number99,而是声明一个数组变量,比如 numbers,然后使用 numbers[0]、numbers[1]、…、numbers[99] 来代表一个个单独的变量。数组中的特定元素可以通过索引访问。
所有的数组都是由连续的内存位置组成。最低的地址对应第一个元素,最高的地址对应最后一个元素。
这都是啥跟啥啊?!
数组 array是C++等编程语言里重要的数据结构,后期我们将学 栈stack、队列queue等。
同时,C++里面的vector
与Python里面的list
差不多,array
、list
的下标都是从0开始的。为了方便我们后期可能会使用 \(STL\) 大法!
别的先别说了,开搞吧!
数组也有数据类型,比如有整数型的、长整数型的、浮点型的等等,其中的字符数组就是字符串的一种。
定义方法:
数据类型 数组名[数组长度]={数组内容};
我建议大家在定义数组时定义在main
函数外面,这样一是方便其他函数使用,二是这样写可以给数组的每个元素赋值为0(变量的值也是0)。
在主函数内定义,这种数组就成为了局部变量,而且用不到的元素C++默认为随机数,有可能你找半天bug也找不到……
要是给一个数组的每一个元素快速赋值,可以使用memset
函数,就像这样:
// Author:PanDaoxi
#include <bits/stdc++.h>
using namespace std;
int main(){
int a[101];
// 初始化
memset(a,-1,sizeof(a));
// 等同于 int a[101]={};
// 输出
for(int i=0;i<101;i++){
cout<<a[i]<<" ";
}
return 0;
}
那么,给你出一道题:
请你输出正整数 \(n\) 各个数位上的数。
输入:1234
输出:1 2 3 4
哈哈,可惜你没学过字符串,不然轻轻松松就给秒了。
我们可以使用数组储存每一位的数字,然后再输出。
// Author:PanDaoxi
#include <bits/stdc++.h>
using namespace std;
int n,m,a[101],k;
int main(){
cin>>n;
while(n) a[k++]=n%10,n/=10;
// 倒着输出
for(int i=k-1;i>=0;i--){
cout<<a[i]<<" ";
}
return 0;
}
你要是再厉害一点儿呢,可以这么写:
// Author:PanDaoxi
#include <bits/stdc++.h>
using namespace std;
int n,m,a[101],k;
int main(){
cin>>n;
while(n) a[k++]=n%10,n/=10; // 获取每一位上的数字
// 先把每一位的数字变成正确的顺序
for(int i=0;i<k/2;i++){
// 交换两个变量的值
// swap(a[i],a[k-i-1]);
// swap可以交换两个变量的值
// 临时变量法
m=a[i],a[i]=a[k-i-1],a[k-i-1]=m;
}
for(int i=0;i<k;i++){
cout<<a[i]<<" ";
}
return 0;
}
这是个数学原理。要获取 \(a\) 每一位上的数字,可以这么干:
\[a\ mod\ 10( 获取最后一位的数字)\Longrightarrow \left \lfloor a{\div} 10 \right \rfloor (a缩小到原来的\frac{1}{10}) \]
总之,任何强大的成绩,都建立在海量的刷题之上。
来做个俩题儿吧:
第一题不难,你应该已经有思路了吧?!
很简单,用上刚刚的数组知识,解个这种题嘎嘎简单!
//Author:PanDaoxi
#include <bits/stdc++.h>
using namespace std;
int main(){
int n,a[101],k=0;
while(cin>>n){
a[k++]=n;
}
for(int i=k-1;i>=0;i--){
if(a[i]==0) continue;
cout<<a[i]<<" ";
}
return 0;
}
后面这个也不难,掌握方法就行。
// Author:PanDaoxi
#include <bits/stdc++.h>
using namespace std;
int main(){
int n,a[101],b[101],k=0;
cin>>n;
for(int i=0;i<n;i++){
cin>>a[i];
}
for(int i=n-1;i>=0;i--){
int x=0;
for(int j=i;j>=0;j--){
if(a[j]<a[i]) x++;
}
b[k++]=x;
}
for(int i=k-1;i>=0;i--){
cout<<b[i]<<" ";
}
return 0;
}
以下内容为作死,慎重使用
P1427 这个题官方给出的算法标签是递归和栈?,倒也不是不行,不过很有趣。
拓展:考试的时候,测题机会在末尾加上
ctrl+z
退出,所以我们可以利用这一特性来做题。因为这个键(^Z
=ctrl+z
)能终止死循环,所以我们只需要在输入时判断是否为这个键就行了;而这个键的bool值为假,所以输入时就会自动判断了。
模拟法:// Author:PanDaoxi #include <bits/stdc++.h> using namespace std; int main(){ int a[101]={},k=0; while(cin>>a[k++]); // 输入数据 // 如果不是0就输出 for(int i=k-2;i>=0;i--) if(a[i]!=0) cout<<a[i]<<" "; return 0; }
递归法:
// Author:PanDaoxi
#include <bits/stdc++.h>
using namespace std;
int x;
void f(int k){
if(k==0) return;
cin>>x;
f(x);
cout<<k<<" ";
}
int main(){
cin>>x;
f(x);
return 0;
}
栈法:
// Author:PanDaoxi
#include <bits/stdc++.h>
using namespace std;
int main(){
stack<int> st;
int n,m;
while(cin>>n){
st.push(n);
}
while(!st.empty()){
m=st.top();
if(m!=0) cout<<m<<" ";
st.pop();
}
return 0;
}