目录
1.数组定义
数组,就是一堆变量组合起来,定义方式:int a[ 9 ];这里我们定义了一个长度为9的数组
a[0] | a[1] | a[2] | a[3] | a[4] | a[5] | a[6] | a[7] | a[8] |
新手常犯错误1:数组越界
比如想开一个长为9的数组,写int a[9]是不够的,最大下标只到8,于是数组就越界了
解决办法
开的时候长度+1就可以了
新手常犯错误2:忘加分号
数组末尾一定记得加;
2.数组使用
2.1 输入
简单,加个for循环就好了^_^
像这样
for( int n=1;n<=[];n++ )
{
cin >> a[i];
}
我们来逐行解析上面的代码
1for循环:点这里!for循环的详解
3:输入数组的第i项
2.2 数组算法——桶排序
桶排序
小C有n个随机数,他想要把这m个数从小到大排序,让我们来看看他是怎么排序的吧!
(n<=10000)
例如:1,1,5,3
首先,小C定义一个数组,a数组
int a[10001];
然后输入临时变量t,可以用for循环
int t;
for(int i=1;i<=n;i++)
{
cin >> t;
}
接下来就是桶排序了!我们可以把a数组的位置想象成盒子,之后我们需要把输入的数字放到“盒子”里,我们可以派“哨兵i”去最左边,一步一步向右走(即i++),找数并且放到盒子里
下面我们来模拟一下过程:
第一步,
i哨兵发现了1,于是他把1放到了1号盒子(a[1]=1)
他又向右走,他又发现了1!于是他又把1放到了1号盒子。现在1号盒子里面已经又两个元素了(即a[i]=2)
他又向右走,他发现了5!于是他把5放到了5号盒子。
他又向右走,他发现了3!于是他把3放到了3号盒子。
他又向右走……不好,右边什么也没有了;说明桶排序第一步结束了
接下来是第二步,也是最后一步,输出
for(int i=1;i<=n;i++)
{
int t;
cin >> t;
a[t]++;
}
for(int i=1;i<=n;i++)
{
if(a[i]!=0)
{
for(int j=1;j<=a[i];j++)
{
cout << i << " ";
}
}
}
好了关于桶排序就讲到这里了
2.3 数组模拟
2.3.1 数组模拟栈
众所周知,栈是一种现金后出的东东,下面上个图大家就明白了
现在a是一个空栈
接下来我们往a里面放3个元素“20,40,70”
70 |
40 |
20 |
a就会变成这样子
这时候往外取会先取最上面的70,然后取40,最后取20
原理就到这里,接下来实践
怎么整呢?
首先我们整一个数组,叫做stk(尽量不要叫stack,那样可能会让编译器误判)
int stk[101];
上面我们定义了一个长度为101的数组stk,用来模拟栈。
接下来我们需要一个整型变量用来记录栈顶,不妨叫它top吧!于是我们就有了一个top整型变量
int top=0;
特别注意:top一开始一定要初始化为0,否则会发生不可估计的错误!
接下来是栈的一些操作,我们要用数组实现:
1:入栈 push(x);
2:出栈 pop();
3:大小 size();
4:判断栈是否为空 empty();
5:栈顶读取 Top();
1. 入栈
这个很简单,只要输入stk[top]然后top++就可以了
2.出栈
这个也很简单,先top--,再cout << stk[top]就可以了
3.大小
直接返回top就行了
4.判断栈是否为空
判断top,如果top==0,就代表stk是一个空栈,否则不是空栈
5:栈顶读取
返回stk[top]就可以了
完整代码
#include<iostream>
#include<cstring> // 包含cstring头文件以使用memset
using namespace std;
int stack[1000001];
int top = 0;
void push(int x) {
if (top < 1000000) { // 确保不会越界
stack[top] = x;
top++;
} else {
cout << "Stack is full!" << endl;
}
}
void pop() {
if (top > 0) { // 确保不会越界
top--;
} else {
cout << "Empty" << endl;
}
}
void query() {
if (top != 0) {
cout << stack[top - 1] << endl;
} else {
cout << "Anguei!" << endl;
}
}
void size() {
cout << top << endl;
}
int main() {
int t, n;
cin >> t;
while (t--) {
cin >> n;
for (int i = 0; i < n; i++) {
string s;
cin >> s;
if (s == "push") {
int m;
cin >> m;
push(m);
} else if (s == "pop") {
pop();
} else if (s == "query") {
query();
} else if (s == "size") {
size();
}
}
}
return 0;
}
2.3.2 数组模拟链表
这篇关于链表的教程我相信有人看过,不过大部分人看完之后还是蒙圈了
如果你觉得这篇教程简直就是天书,或者你压根很讨厌指针这些东西,没有关系,我教你用两个数组搞定!
链表的优势:
现在给定一个已经排好序的数列4,6,10,12,19,现在我们想要在4和6之间插入5
数组:插入5,后面的都要往后挪一位,极其不方便
链表:直接添加节点,方便
接下来我们上机操作!
首先我们定义两个数组
int data[];
int right[];
然后输入两个数组
data是正经用来存东西的数组,right[i]用来记录data[i]右边是data[几]
例如:
data:4,6,10,12,19
right:2,3,4,5,0
我们要在4,6之间插入5:
data:4,6,10,12,19,5
right:6,2,3,4,5,0
是不是很方便?