数据结构实验之栈六:下一较大值(二)

来源:互联网 发布:linux虚拟机建立文件夹 编辑:程序博客网 时间:2024/05/21 12:15

对于包含n(1<=n<=100000)个整数的序列,对于序列中的每一元素,在序列中查找其位置之后第一个大于它的值,如果找到,输出所找到的值,否则,输出-1。
输入
输入有多组,第一行输入t(1<=t<=10),表示输入的组数;
以后是 t 组输入:每组先输入n,表示本组序列的元素个数,之后依次输入本组的n个元素。
输出
输出有多组,每组之间输出一个空行(最后一组之后没有);
每组输出按照本序列元素的顺序,依次逐行输出当前元素及其查找结果,两者之间以–>间隔。
示例输入
2
4 12 20 15 18
5 20 15 25 30 6
示例输出
12–>20
20–>-1
15–>18
18–>-1

20–>25
15–>25
25–>30
30–>-1
6–>-1
题解:这个题让我对栈有了更深的理解,最起码我现在知道了不能直接对栈内的元素直接操作,其实现在我也不是很明白,为什么会这样。好了现在说说这道题,这道题其实很简单,就看看你是否真正的理解栈,对于这道题,找离它最近的比它大的数,先往栈内放入一个数,然后再往栈内放比它小的数,遇到比栈顶元素大的数就记录下来,然后重复这个过程。
#include<bits/stdc++.h>
using namespace std;
struct node
{
int data;
int nextdata;
int pos;//记录每个元素的位置
} test[100001];
int main()
{
int n,i,m;
struct node p;//由于不能直接对栈顶元素操作,通过赋值来实现。
stack<struct node> st;
cin>>n;
while(n--)
{
cin>>m;
for(i=0; i<m; i++)
{
cin>>test[i].data;
test[i].pos=i;
if(st.empty())
st.push(test[i]);//往栈内放入第一个元素
else
{
while(!st.empty())
{
p=st.top();//这就是对栈顶元素操作的过程
if(p.data<test[i].data)
{
test[p.pos].nextdata=test[i].data;
st.pop();
}
else
break;
}
st.push(test[i]);//比栈顶元素小的直接入栈
}
}
while(!st.empty())
{
p=st.top();
test[p.pos].nextdata=-1;//栈里的剩余元素都是找不到比它大的值的
st.pop();
}
for(i=0; i<m; i++)
{
if(i==0)
cout<<test[i].data<<"-->"<<test[i].nextdata;
else
cout<<endl<<test[i].data<<"-->"<<test[i].nextdata;
}
cout<<endl;
}
return 0;
}

0 0
原创粉丝点击