[2021.8.14] 算法第一弹

来自洛谷的题解转载

挑战算法Day01:看了题解才知道天地之大(自己多菜 ),后面还有解法,囿于知识的贫乏,先暂时列举这些还能接受的,后续搞清楚再续跟。

原作者的题解如下,做了部分修改:
1.常规做法
把输入的数都存起来,然后反向遍历输出

#include<iostream>
using namespace std; 
int x[100],c=0;
int main(){
    for(int i=0;;i++){
        cin>>x[i];
        if(x[i]==0) break; 
        c=i;
    }
    for(int j=c;j>=0;j--)
    cout<<x[j]<<" ";
    return 0;
}

2.栈
栈是NOIP里的一种必会的基础数据结构,结构简单功能强大(?)。栈的基本思想是先进后出,后进先出。利用栈的这个特性往往可以完成一些意想不到的操作。栈的一个用途就是将一串数据反向输出。

(1)手打栈
栈的实现比较简单,只需要开一个空数组,然后用一个top变量表示栈顶元素的位置即可。入栈就将top++然后将栈顶元素赋值即可。出栈只需top–,连清零都不用(善于思考的同学们可以想一下这是为什么)。下面就是一段手打栈代码:

#include<iostream>
using namespace std;
int a[101];//如果你的第一个数存储在a[1]里,一定要多开一两个空间 ,以防越界访问
int top=0,c;
int main(){
    while(1){
        cin>>c;
        if(c==0) break;
        a[++top]=c;
        /*
        或者写成:
        top++;
        a[top]=c;
        个人比较喜欢压码……
        */ 
    }
    while(top!=0){
        cout<<a[top--]<<" ";
        /*
        或者写成:
        cout<<a[top];
        top--;
        */ 
    }
    return 0;
} 

(2)STL栈
要问C++最大的好处是什么?那就是C++有着丰富的STL库(Standard Template Library)。STL和普通数组的最大区别我认为体现在两方面:一是有着丰富的自带函数,可以省去手打的麻烦,二就是完全不用担心数组开的不够大或者过大的尴尬。你让它多大它就多大,空间零浪费。

STL中最基本的一种数据结构就是vector了。下面就是一版用vector写出来的代码:

#include<iostream>
#include<vector>//STL vector的头文件
using namespace std;
vector<int> a;//定义一个int型的vector 
int c;//STL可以完全不用担心数组大小的问题,这个和string类似 
int main(){
    while(1){//有时候也可以巧用死循环 
        cin>>c;
        if(c==0) break;//终止条件 
        a.push_back(c);//将括号里的元素压入vector尾部 
    }
    while(!a.empty()){
        cout<<a.back()<<" ";//.back()是一个返回vector尾部元素的函数 
        a.pop_back();//删除vector尾部的元素
    }
    /*
    这一部分输出程序也可以写成:
    for(int i=a.size()-1;i>=0;i--){//a.size()返回a中元素的个数
        cout<<a[i]<<" ";
    }
    要注意vector是从a[0]开始存储a.size()个元素,要当心越界访问
    */
    return 0;
} 

STL中还有一个专门为栈设计的数据结构——stack。它的操作与vector类似,但是函数名称简洁了不少,而且省去了一些对于栈无用的冗杂的函数。下面就是一版用stack写的代码:

#include<iostream>
#include<stack>//STL stack的头文件
using namespace std;
stack<int> a;//定义一个int型的stack 
int c;
int main(){
    while(1){
        cin>>c;
        if(c==0) break;
        a.push(c);//将括号里的元素压入stack顶部 
    }
    while(!a.empty()){
        cout<<a.top()<<" ";//.top()是一个返回stack顶部元素的函数 
        a.pop();//删除stack顶部的元素 
    }
    return 0;
} 

以下是大佬所用的知识点(我需要攻克并掌握的
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值