day22--小鱼记忆--2.26
习题概述
题目描述
小鱼最近被要求参加一个数字游戏,要求它把看到的一串数字 ai(长度不一定,以 0 结束),记住了然后反着念出来(表示结束的数字 0 就不要念出来了)。这对小鱼的那点记忆力来说实在是太难了,你也不想想小鱼的整个脑袋才多大,其中一部分还是好吃的肉!所以请你帮小鱼编程解决这个问题。
输入格式
一行内输入一串整数,以 0 结束,以空格间隔。
输出格式
一行内倒着输出这一串整数,以空格间隔。
代码展示
法一:常规做法,利用for循环来改变条件使得其逆序输出
#include<bits/stdc++.h>
using namespace std;
int x[100],c=0;
int main()
{
for(int i=0;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;
}
法二: STL栈
1. STL中最基本的一种数据结构就是vector
#include<bits/stdc++.h>
using namespace std;
vector<int> a;
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;
}
2. STL中还有一个专门为栈设计的数据结构—stack(后进先出)
#include<bits/stdc++.h>
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;
}
法三:指针法
1. 数组指针
#include<bits/stdc++.h>
using namespace std;
int a[101],c;
int *p=a;//定义一个int类型的指针,指向数组不用取地址符
int main(){
while(1){
cin>>c;
if(c==0) break;
p++;//指针指向当前所指元素在数组中的下一个元素
*p=c;//星号表示这个指针现在不是代表地址而是代表该地址的元素
}
while(p!=a){//当指针不是指向数组的第一个元素地址
cout<<*p<<" ";
p--;
}
return 0;
}
2. STL指针—迭代器
#include<bits/stdc++.h>
using namespace std;
vector<int> a;
int c;
int main(){
while(1){
cin>>c;
if(c==0) break;
a.push_back(c);
}
for(vector<int>::iterator it=a.end()-1;it>=a.begin();it--)
{
/*a.end()返回的是a中最后一个元素后面的地址,因此一定要记得-1
a.begin()返回a的第一个元素的地址
*/
cout<<*it<<" "; //*it表示it所指的元素
}
return 0;
}
法四:sort函数排序法
#include<bits/stdc++.h>
using namespace std;
struct node
{
int time;//存储该数据被输入的时间先后
int value;//存储该数据的赋值
}a[101];
int c,n;
int cmp(node x,node y){//自定义比较函数
return x.time>y.time;
}
int main(){
while(1){
cin>>c;
if(c==0) break;
a[n].value=c;
a[n].time=n;
n++;
}
sort(a,a+n,cmp);//前两个变量分别表示开始排序的元素的地址和结束排序的元素的地址
for(int i=0;i<n;i++){
cout<<a[i].value<<" ";
}
return 0;
}
法五:优先队列法
#include<bits/stdc++.h>
using namespace std;
struct node{
int time;
int value;
}t;
priority_queue<node> a;
bool operator<(const node &x,const node &y){//这里比较函数的名字不能改,两个const和两个&也不能去掉
return x.time<y.time;
}//定义优先队列的比较函数,这个和sort相反,是使得排序后前后代入可以return false,具体细节请自行了解吧
int c,n;
int main(){
while(1){
cin>>c;
if(c==0) break;
n++;
t.value=c;
t.time=n;
a.push(t);//将元素输入优先队列
}
while(!a.empty()){
cout<<a.top().value<<" ";//.top()返回优先队列的第一个元素
a.pop();//删除优先队列的第一个元素
}
return 0;
}
未完待续...等我复习完数据结构一轮之后再来 深度优先搜索(DFS),广度优先搜索(BFS),二叉树后序(中序)遍历,dijkstra算法
心得体会
1. 栈(Stack)是一种常见的数据结构,它遵循后进先出的原则。栈通常用于存储和管理数据,在栈中,最后插入的元素会被最先删除。
栈有两种基本操作:
1.压栈(Push):向栈顶添加一个元素。
2.出栈(Pop):从栈顶移除一个元素。
除了上述基本操作外,栈还可以支持以下操作:
·栈顶(Top):获取栈顶元素但不删除。
·判空(Empty):判断栈是否为空。
·大小(Size):获取栈中元素的数量。
2. sort函数介绍
vector<int> vec = {3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5};
sort(vec.begin(), vec.end()); // 对向量进行排序默认升序
sort(vec.begin(), vec.end(), greater<int>()); //使用自定义排序规则进行降序排序
3. 优先队列法
优先队列(Priority Queue)是一种特殊的队列,它的元素按照一定的顺序进行排列;
支持自定义比较函数,以便于适应不同的排序需求。例如,如果我们想要按照降序排列,可以这样创建优先队列:
priority_queue<int, vector<int>, less<int>> pq;
常见应用场景: 优先队列常用于实现一些贪心算法、最短路径算法(如 Dijkstra 算法)、最小生成树算法(如 Prim 和 Kruskal 算法)等需要根据优先级进行处理的算法中