資料結構實驗之棧與隊列六:下一較大值(二)
Time Limit: 150MS Memory Limit: 8000KB
Submit Statistic
Problem Description
對于包含n(1<=n<=100000)個整數的序列,對于序列中的每一進制素,在序列中查找其位置之後第一個大于它的值,如果找到,輸出所找到的值,否則,輸出-1。
Input
輸入有多組,第一行輸入t(1<=t<=10),表示輸入的組數;
以後是 t 組輸入:每組先輸入n,表示本組序列的元素個數,之後依次輸入本組的n個元素。
Output
輸出有多組,每組之間輸出一個空行(最後一組之後沒有);
每組輸出按照本序列元素的順序,依次逐行輸出目前元素及其查找結果,兩者之間以–>間隔。
Example Input
2
4 12 20 15 18
5 20 15 25 30 6
Example Output
12–>20
20–>-1
15–>18
18–>-1
20–>25
15–>25
25–>30
30–>-1
6–>-1
思路:
我們要找目前元素的下一個比它大的值。我們可以用一個棧,保持單調遞減。如果通路到的元素,比棧頂元素大,那麼棧頂元素的下一個比它大的值就是通路的元素。直到棧頂元素比通路元素大,那麼通路元素入棧。開個結構體存下id就好了。
#include<bits/stdc++.h>
using namespace std;
struct node
{
int data, id;
};
#define nn 100005
int a[nn], vis[nn];
int main()
{
int T, n, i;
scanf("%d", &T);
while(T--)
{
scanf("%d", &n);
stack<node> q;
for(i = ; i < n; i++)
{
scanf("%d", &a[i]);
while(!q.empty())//棧不為空
{
node t = q.top();
if(t.data < a[i])//判斷棧頂元素 和 通路元素大小
{
vis[t.id] = a[i];//棧頂元素小,棧頂元素下一個大于它的值就是通路元素
q.pop();
}
else break;
}
q.push((node){a[i], i});//入棧
}
while(!q.empty())//剩下的元素代表找不到下一個比它大的元素
{
node t = q.top();
vis[t.id] = -;
q.pop();
}
for(i = ; i < n; i++)//輸出
{
printf("%d-->%d\n", a[i], vis[i]);
}
printf("\n");
}
}