P1427
题目描述
小鱼最近被要求参加一个数字游戏,要求它把看到的一串数字(长度不一定,以0结束,最多不超过100个,数字不超过2^32-1),记住了然后反着念出来(表示结束的数字0就不要念出来了)。这对小鱼的那点记忆力来说实在是太难了,你也不想想小鱼的整个脑袋才多大,其中一部分还是好吃的肉!所以请你帮小鱼编程解决这个问题。
输入输出格式
输入格式:
一行内输入一串整数,以0结束,以空格间隔。
输出格式:
一行内倒着输出这一串整数,以空格间隔。
输入输出样例
输入样例:
3 65 23 5 34 1 30 0
输出样例:
30 1 34 5 23 65 3
提供以下几种做法:
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里的一种必会的基础数据结构,结构简单功能强大。栈的基本思想是先进后出,后进先出。利用栈的这个特性往往可以完成一些意想不到的操作。栈的一个用途就是将一串数据反向输出。
①手打栈
栈的实现比较简单,只需要开一个空数组,然后用一个top变量表示栈顶元素的位置即可。
入栈就将top++,然后将栈顶元素赋值即可。出栈只需top--,连清零都不用。下面就是一段手打栈解法代码:
1 #include <bits/stdc++.h> 2 using namespace std; 3 int a[101]; 4 int top=0,c; 5 int main(){ 6 while(1){ 7 cin>>c; 8 if(c==0)break; 9 a[++top]=c; 10 } 11 while(top!=0){ 12 cout<<a[top--]<<" "; 13 } 14 return 0; 15 }
②STL栈(C++)
直接调用STL里和栈有关的函数。
代码如下:
用vector:
1 #include <bits/stdc++.h> 2 using namespace std; 3 vector<int> a;//定义一个int型的vector 4 int c; 5 int main(){ 6 while(1){ 7 cin>>c; 8 if(c==0)break; 9 a.push_back(c);//将括号里的元素压入vector尾部 10 } 11 while(!a.empty()){ 12 cout<<a.back()<<" ";//.back()是一个返回vector尾部元素的函数 13 a.pop_back();//删除vector尾部的元素 14 } 15 /* 16 这一部分输出程序也可以写成: 17 for(int i=a.size()-1;i>=0;i--){//a.size()返回a中元素的个数 18 cout<<a[i]<<" "; 19 } 20 要注意vector是从a[0]开始存储a.size()个元素,要当心越界访问 21 */ 22 return 0; 23 }
用stack:
stack与vector类似,但是函数名称简洁了不少,而且省去了一些对于栈无用的冗杂的函数。
代码如下:
1 #include <bits/stdc++.h> 2 using namespace std; 3 stack<int> a;//定义一个int型的stack 4 int c; 5 int main(){ 6 while(1){ 7 cin>>c; 8 if(c==0)break; 9 a.push(c); 10 } 11 while(!a.empty()){ 12 cout<<a.top()<<" "; 13 a.pop(); 14 } 15 return 0; 16 }