【C++干货系列】数组专栏

目录

1.数组定义

 2.数组使用

2.1 输入

2.2 数组算法——桶排序

2.3 数组模拟

2.3.1 数组模拟栈

2.3.2  数组模拟链表




1.数组定义

数组,就是一堆变量组合起来,定义方式:int a[ 9 ];这里我们定义了一个长度为9的数组

a数组

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是一个空栈

接下来我们往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

是不是很方便?

  • 8
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值