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

 从后向前入栈,每遇到一个比栈顶值大的数,都要弹出栈顶,然后让这个数进栈,这样,栈内元素从上到下依次递增。

#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;
}

猜你喜欢

转载自blog.csdn.net/JKxiaoming/article/details/81698466