sdut oj3333 数据结构实验之栈六:下一较大值(二)
来源:互联网 发布:la域名注册查询 编辑:程序博客网 时间:2024/06/04 18:20
题目链接:点击打开链接
数据结构实验之栈六:下一较大值(二)
Time Limit: 150MS Memory limit: 8000K
题目描述
对于包含n(1<=n<=100000)个整数的序列,对于序列中的每一元素,在序列中查找其位置之后第一个大于它的值,如果找到,输出所找到的值,否则,输出-1。
输入
输入有多组,第一行输入t(1<=t<=10),表示输入的组数;
以后是 t 组输入:每组先输入n,表示本组序列的元素个数,之后依次输入本组的n个元素。
输出
输出有多组,每组之间输出一个空行(最后一组之后没有);
每组输出按照本序列元素的顺序,依次逐行输出当前元素及其查找结果,两者之间以-->间隔。
示例输入
24 12 20 15 185 20 15 25 30 6
示例输出
12-->2020-->-115-->1818-->-120-->2515-->2525-->3030-->-16-->-1
提示
本题数据量大、限时要求高,须借助栈来完成。
手写的栈:
代码实现:
#include <iostream>#include <stdio.h>#include <stdlib.h>#include <string.h>using namespace std;#define stackmax 100010///定义结构体struct node{ int num, id, next;};typedef struct{ node *top; node *base; int stacksize;}Sqstack;///初始化栈int initStack(Sqstack &s){ s.base=(node*)malloc(stackmax*sizeof(node)); if(!s.base) return -1; s.top=s.base; s.stacksize=stackmax; return 0;}///栈的清空void Clear(Sqstack &s){ s.top=s.base;}void push(Sqstack &s,node &e){ *(s.top++)=e;}void pop(Sqstack &s){ s.top--;}int isempty(Sqstack &s){ if(s.top==s.base) return 1; return 0;}node Gettop(Sqstack &s){ return *(s.top-1);}node a[stackmax];int main(){ Sqstack s; initStack(s); int t,n; scanf("%d",&t); for(int i=1;i<=t;i++) { while(isempty(s)==0)///对栈进行清空操作 pop(s); if(i>1) printf("\n");///控制空行的输出 scanf("%d",&n); for(int i=1;i<=n;i++) { scanf("%d",&a[i].num); a[i].id=i; a[i].next=-1; if(isempty(s)==1) push(s,a[i]); else { while(isempty(s)==0)///栈不为空时 { node b; b=Gettop(s); if(b.num<a[i].num)///如果栈顶元素大于该元素,则将该元素赋给栈顶元素的next { a[b.id].next=a[i].num; pop(s);///栈顶元素出栈 } else break; } push(s,a[i]);///不管怎样,判断完之后让该元素进栈 } } for(int i=1;i<=n;i++)///输出 printf("%d-->%d\n",a[i].num,a[i].next); } return 0;}
或者采用STL做法:
#include <iostream>#include <stdio.h>#include <string.h>#include <stdlib.h>#include <stack>using namespace std;struct node///运用结构体记录{ int num; int id; int next;};node a[100100];int main(){ int t,n; stack<node> S;///定义结构体的栈 scanf("%d",&t); for(int i = 0; i < t; i++) { while(!S.empty())///对栈进行清空 S.pop(); if(i > 0) printf("\n"); scanf("%d",&n); for(int i = 0; i < n; i++) { scanf("%d",&a[i].num); a[i].id = i; a[i].next = -1; if(S.empty()) S.push(a[i]); else { while(!S.empty()) { node b; b = S.top(); if(b.num < a[i].num) { a[b.id].next = a[i].num; S.pop(); } else break; } S.push(a[i]); } } for(int i = 0;i < n;i++) printf("%d-->%d\n",a[i].num,a[i].next); } return 0;}
0 0
- 数据结构实验之栈六:下一较大值(二) (sdut oj3333)
- sdut oj3333 数据结构实验之栈六:下一较大值(二)
- 暑假集训 7.30 数据结构实验之栈六:下一较大值(二)sdut oj3333(手写栈)
- SDUT 3333数据结构实验之栈六:下一较大值(二)(栈)
- SDUT 数据结构实验之栈六:下一较大值(二)
- SDUT Oj数据结构实验之栈六:下一较大值(二)
- acm sdut 数据结构实验之栈六:下一较大值(二)
- sdut 3333 数据结构实验之栈与队列六:下一较大值(二)
- SDUT 3333 数据结构实验之栈与队列六:下一较大值(二)
- SDUT 3333 数据结构实验之栈六:下一较大值(二)
- 【单调栈】SDUT 3333 数据结构实验之栈与队列六:下一较大值(二)
- 数据结构实验之栈六:下一较大值(二)—栈+动态规划
- 【单调栈】数据结构实验之栈与队列六:下一较大值(二)
- 数据结构实验之栈六:下一较大值(二)
- 数据结构实验之栈六:下一较大值(二)
- SDUT3333数据结构实验之栈六:下一较大值(二)
- 数据结构实验之栈六:下一较大值(二)
- 数据结构实验之栈六:下一较大值(二)
- 《机器学习》周志华学习笔记——第一章 绪论
- Spring Security 3.1 中功能强大的加密工具 PasswordEncoder
- 捋一捋Android的转场动画
- 重新认识 MVC 和 三层设计模式
- iOSweex集成入门,weex快速上手教程,weex集成到iOS工程注意事项(一)
- sdut oj3333 数据结构实验之栈六:下一较大值(二)
- 不愿让别人看见,只自己看的注释应该怎么写
- Python 學習手冊(第4版)
- Stanford深度学习与自然语言处理讲义下载(CS224)
- 【5】使用结巴分词对分类语料库分词
- 给人生再一个转折
- [leetcode] 319. Bulb Switcher
- Linux系统网络编程中TCP通讯socket--send导致进程被关闭
- 开放源代码机器人控制软件