挑战算法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;
}
以下是大佬所用的知识点(我需要攻克并掌握的)