資料結構實驗之棧與佇列六 下一較大值(二)

2021-09-12 09:14:42 字數 2079 閱讀 2394

problem description

對於包含n(1<=n<=100000)個整數的序列,對於序列中的每一元素,在序列中查詢其位置之後第乙個大於它的

值,如果找到,輸出所找到的值,否則,輸出-1。

input

輸入有多組,第一行輸入t(1<=t<=10),表示輸入的組數;

以後是 t 組輸入:每組先輸入n,表示本組序列的元素個數,之後依次輸入本組的n個元素。

output

輸出有多組,每組之間輸出乙個空行(最後一組之後沒有);

每組輸出按照本序列元素的順序,依次逐行輸出當前元素及其查詢結果,兩者之間以–>間隔。

sample input

24 12 20 15 18

5 20 15 25 30 6

sample output

12–>20

20–>-1

15–>18

18–>-1

20–>25

15–>25

25–>30

30–>-1

6–>-1

思路:就是按照給定的資料逆序進行入棧出棧操作。

來儲存下一最大值。

意思就是從最後乙個資料開始入棧,在入棧之前先找下一最大值。如果這時棧是空的,證明沒有下一最大值。

如果不空,就出棧,直到找到比當前資料大的或者棧為空為止。

這裡注意的是,題目是找「下乙個」最大值(就是距離自己最近的比自己大的數),所以說,比當前數值小的資料出

棧對以後的操作沒有任何的影響。

#include #include #include #include #include #include using namespace std;

int main()

//出棧,直到為空棧或者找到比自己大的數停止。

else

//沒有找到那個它,就是-1了,入棧。

if(st1.empty())

else}}

//把第二個棧按照出棧的順序輸出就行了。

for(int i=0; i%d\n",a[i],st2.top());

st2.pop();

}//最後注意一下,最後一組沒有空行

printf(t==0?"":"\n");}}

return 0;

}

第二種方法:這種方法就是犧牲空間換時間。使用c寫的。
#include

#include

int a[

100005];

//輸入的資料

int b[

100005];

//棧,儲存資料

int c[

100005];

//棧,儲存索引

int d[

100005];

//最終輸出的資料

intmain()

else

if(j>-1

&&b[j]

) b[

++j]

= a[i]

; c[j]

= i;}}

for(i=

0;i)printf

(i==n-1?

"%d-->%d\n\n"

:"%d-->%d\n"

,a[i]

,d[i]);

}return0;

}

精簡版:在第二種方式的基礎上簡化

#include

#include

int a[

100005

],b[

100005

],c[

100005

],d[

100005];

intmain()

for(i=

0; i)printf

(i==n-1?

"%d-->%d\n\n"

:"%d-->%d\n"

,a[i]

,d[i]);

}return0;

}

資料結構實驗之棧與佇列六 下一較大值(二)

time limit 150ms memory limit 8000kb submit statistic problem description 對於包含n 1 n 100000 個整數的序列,對於序列中的每一元素,在序列中查詢其位置之後第乙個大於它的值,如果找到,輸出所找到的值,否則,輸出 1。...

資料結構實驗之棧與佇列六 下一較大值(二)

資料結構實驗之棧與佇列六 下一較大值 二 time limit 150 ms memory limit 8000 kib problem description 對於包含n 1 n 100000 個整數的序列,對於序列中的每一元素,在序列中查詢其位置之後第乙個大於它的值,如果找到,輸出所找到的值,否...

資料結構實驗之棧與佇列六 下一較大值(二)

problem description 對於包含n 1 n 100000 個整數的序列,對於序列中的每一元素,在序列中查詢其位置之後第乙個大於它的值,如果找到,輸出所找到的值,否則,輸出 1。input 輸入有多組,第一行輸入t 1 t 10 表示輸入的組數 以後是 t 組輸入 每組先輸入n,表示本...