从后向前入栈,每遇到一个比栈顶值大的数,都要弹出栈顶,然后让这个数进栈,这样,栈内元素从上到下依次递增。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define sum 10000
#define add 1000
typedef struct
{
int *top;
int *base;
int size;
}stack;//建立一个栈的结构体,有顶指针,尾指针,栈的尺寸。
void Init(stack *s)
{
s -> base = (int*)malloc(sizeof(int));//申请内存
if(!s -> base)//如果申请失败,则退出
exit(0);
s -> top = s -> base;//如果成功,空栈的顶指针和尾指针指向同一个地方
s -> size = sum;//分配栈的大小
}//建立一个空栈
void Push(stack *s, int e)
{
if(s -> top - s -> base >= s -> size)//如果栈已经满了
{
s -> base = (int*)realloc(s -> base,(s -> size+add)*sizeof(int));//申请扩充栈的内存
if(!s -> base)//如果申请失败,则退出
exit(0);
s -> top = s -> base + s -> size;//如果成功,如建空栈
s -> size = s -> size + add;
}
*(s -> top) = e;//将某个值的位置赋给顶指针,该值入栈成功;
s -> top++;//顶指针上移;
}
void Pop(stack *s)
{
if(s -> top == s -> base)//如果顶指针和尾指针指向同一个位置,那么栈空,弹出失败;
return ;
s -> top--;//弹出栈顶元素,但是没有输出,栈顶指针下移;
}
int main()
{
stack s;//定义栈;
int t, n, i, a[100001], b[100001];
while(~scanf("%d",&t))
{
while(t--)
{
Init(&s);//建立空栈
scanf("%d",&n);
for(i =0 ; i < n; i++)
scanf("%d",&a[i]);
Push(&s,a[n-1]);//将最后一个值入栈,作为倒数第二个数的参考;
b[n-1] = -1;//最后一个数一定是指向-1的;
for(i = n - 2; i >= 0; i--)//从倒数第二个数开始;
{
if(a[i]<*(s.top-1))//如果这个数小于栈顶的数
{
b[i] = *(s.top-1);//将栈内的数赋给要指的向的数组;
Push(&s,a[i]);//将这个数入栈,作为下个数的参考;
}
else//如果这个数大于等于栈顶的数
{
while(a[i]>=*(s.top -1)&& s.top != s.base);//当这个数大于栈顶值,并且栈不为空的时候,循环继续;
Pop(&s);//弹出栈顶值;
if(s.top == s.base)//如果栈为空;
b[i] = -1;//该值指向-1,将-1赋值给被指向的数组;
else//如果栈不为空,并且这个数小于栈顶值;
b[i] = *(s.top-1);//将栈顶值赋给被指向的数组
Push(&s,a[i]);//这个数是比栈顶值大的数,将它进栈;
}
}
for(i =0 ; i < n; i++)
printf("%d-->%d\n",a[i],b[i]);
if(t !=0)
printf("\n");
}
}
return 0;
}