对于包含n(1<=n<=100000)个整数的序列,对于序列中的每一元素,在序列中查找其位置之后第一个大于它的值,如果找到,输出所找到的值,否则,输出-1。
以后是 t 组输入:每组先输入n,表示本组序列的元素个数,之后依次输入本组的n个元素。
每组输出按照本序列元素的顺序,依次逐行输出当前元素及其查找结果,两者之间以-->间隔。
#include <bits/stdc++.h> using namespace std; struct node { int data;//当前数值 int Id;//标记当前数值Id所在,若找到其后的较大值,更新其所在Id数值 int nextdata;//下一较大值 }; node array[100010]; int main() { int n, k; stack<node>S; while(scanf("%d",&k)!=EOF) { for(int t = 1; t <= k; t++) { while(!S.empty()) { S.pop(); }//栈清空 scanf("%d",&n); for(int j = 1; j <= n; j++) { scanf("%d",&array[j].data); array[j].Id = j; //初始化 array[j].nextdata = -1; if(S.empty()) //栈内无元素,第一个进栈 { S.push(array[j]); } else //栈不为空 { while(!S.empty())//不断取其栈顶元素,更新其栈顶元素下一较大值 { node tmp = S.top();//取栈顶元素 ,从第一个元素开始 int k = tmp.Id;//获取栈顶元素Id if(tmp.data < array[j].data)//将当前元素与其上一个元素数据比较大小 { array[k].nextdata = array[j].data;//更新栈顶元素Id所在的较大值 S.pop();//将较大值出栈 } else break; } S.push(array[j]);//将当前数值入栈,便于查找当前值下一较大值 } } for(int i = 1; i <= n; i++) { printf("%d-->%d\n",array[i].data,array[i].nextdata); } if(t != k) { printf("\n"); } } } return 0; }
转载于:https://www.cnblogs.com/CCCrunner/p/6444601.html
相关资源:JAVA上百实例源码以及开源项目