数据结构——栈

article/2025/8/16 11:18:24

栈和队列

  • 栈和队列
    • 介绍
    • 特点
    • 栈、队列与一般线性表的区别
    • 栈——stack
      • 栈的基本运算
      • 栈的存储结构
        • 顺序栈
        • 链栈
      • 栈的应用

栈和队列

介绍

栈和队列是在软件设计中常用的两种数据结构,它们的逻辑结构和线性表相同

特点

栈和队列在运算上受到了限制:栈是按照“后进先出”的规则进行操作,队列按照“先进先出”的规则进行操作,它们也被称作运算受限的线性表。

栈和队列是限定插入和删除只能在表的端点进行的线性表

在这里插入图片描述

栈、队列与一般线性表的区别

栈和队列是一种特殊的(操作受限)线性表

区别:
仅在于运算规则不同

  • 一般线性表:
    逻辑结构:一对一
    存储结构:顺序表、链表
    运算规则:随机、顺序存取
  • 栈:
    逻辑结构:一对一
    存储结构:顺序栈、链栈
    运算规则:后进先出
  • 队列:
    逻辑结构:一对一
    存储结构:顺序队、链队
    运算规则:先进先出

栈——stack

定义:限定仅在表尾进行插入或删除操作的线性表

表尾——栈顶 表头——栈底

不含元素的空表称为空栈
特点:
先进先出(FILO)或后进后出(LIFO)

栈的基本运算

1、栈初始化:	InitStack(&S)初始条件:	栈S不存在操作结果:	构造一个空栈2、判栈空:	StackEmpty(S)初始条件:	栈S已存在操作结果:	若栈S为空栈 则返回TRUE 否则FLASE3、入栈:		Push(&S,e)初始条件:	栈S已存在操作结果:	插入元素e为新的栈顶元素,栈发生变化4、出栈:		Pop(&S,&e)初始条件:	栈S已存在且非空操作结果:删除S的栈顶元素,并用e返回值,栈发生变化5、读栈顶元素:	GetTop(S,&e)		初始条件:	栈S已存在且非空操作结果:	用e返回S的栈顶元素,栈不变化

由于栈还没有定义存储结构类型所以没有具体实现这些功能,具体实现看下文

栈的存储结构

顺序栈

利用顺序存储方式实现的栈称为顺序栈,类似于顺序表的定义,栈中的数据元素用一个预设的足够长度的一维数组来实现

通常0下标端设为栈底,top为栈顶,其初值指向栈底,则空栈是S.top = S.base。入栈时,栈顶指针加一,即S.top++;出栈时,栈顶指针减一即S.top–

非空栈中的栈顶指针始终在栈顶元素的下一个位置。

类似于线性表的顺序映像实现,指向表尾的指针可以作为栈顶指针

  • 栈的顺序存储表示
#define STACK_INIT_SIZE  100 
#define STACKINCREMENT   10 typedef struct { SElemType *base;    //栈底指针 SElemType *top;     //栈顶指针 int stacksize;      //当前已分配的存储空间 
}SqStack;
  • 初始化栈
Status InitStack(SqStack &S){//构造一个空栈SS.base = (SElemType*)malloc(STACK_INITSIZE*sizeof(SElemType));if(!S.base)exit(OVERFLOW);     //存储分配失败S.top = S.base;S.stacksize = STACK_INIT_SIZE;return OK;
}
  • 判栈空
Status StackEmpty(SqStack S){if(S.top == S.base)return TRUE;elsereturn FALSE;}
  • 求顺序栈的长度
int StackLength(SqStack S){return S.top - S.base;
}
  • 清空顺序栈
Status ClearStack(SqStack S){if(S.base)S.top = S.base;return OK; 
}
  • 销毁顺序栈
Status DestroyStack(SqStack &S){if(S.base){delete S.base;S.stacksize = 0;S.base = S.top = NULL;}return OK;
}
  • 取栈顶元素
Status GeTOP(SqStack S,SELemType &e){if(S.top == S.base)return ERROR;e = *(S.top-1);return OK;
}
  • 入栈
Status Push(SqStack &S,SElemType e){if(S.top - S.base >= S.stacksize){//栈满 追加存储空间S.base = (SElemType*)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(SElemType));if(!S.base)exit(OVERFLOW);     //存储分配失败S.top = S.base+S.stacksize;S.stack += STACKINCREMENT;}*S.top++ = e;return OK;
}
  • 出栈

Status Pop(SqStack &S,SElemType &e) {//若栈不空 则删除S的栈顶元素if(S.top == S.base)return ERROR;e = *--S.top;return OK;
}

注意:

  • 对于顺序栈,入栈时,首先判断栈是否已满:S.top - S.base >= S.stacksize,栈满时不能入栈,否则出现空间溢出引起错误
  • 出栈和读取栈顶元素操作,先要判断栈是否为空,栈空的条件:S.top = S.base,为空时不能操作否则引起错误。
    通常栈空作为一种控制转移条件

链栈

用链式存储结构实现的栈称为链栈
通常链栈用单链表来表示,因此其节点结构和单链表的结构相同

链栈定义结构如下:

typedef struct LNode{LElemType data;struct LNode *next;}LNode,*LinkStack;
LinkStack S;

运算是受限的单链表,只能在链表头部进行操作,所以没有必要附加头结点。栈顶指针就是链表的头指针

链栈的具体操作:

  • 链栈的初始化
Status InitStack(LinkStack &S){S = NULL;return OK;
}
  • 判断链栈是否为空
Status StackEmpty(LinkStack S){if(S == NULL)return TRUE;elsereturn FALSE;}
  • 取链栈栈顶元素‘
Status GetTop(LinkStack S,LElemType &e){if(!S)return ERROR;elsee = S->data;return OK;}
  • 入栈
Status Push_l(LinkStack &S,LElemType e) {//链栈的入栈操作p = new LNode;//p = (LinkStack)malloc(sizeof*(LNode));if(!p)exit(OVERFLOW);p->data = e;p->next = S;S = p;return OK;
}
  • 出栈
Status Pop_l(LinkStack &S,LElemType &e) {//链栈的出栈操作if(!S)return ERROR;e = S->data;q = S;S = S->next;delete q; //free(q);return OK;
}

栈的应用

  1. 递归的实现
    多个函数嵌套调用的规则:后调用先返回

递归:函数直接或间接的调用自身
实现方法:建立递归工作栈

当一个函数在运行期间调用另一个函数时,在运行该被调用函数之前需要先完成三个任务:

  • 将所有的实在参数、返回地址等信息传递给被调用函数保存
  • 为被调用函数的局部变量分配存储区
  • 将控制转移到被调用函数的入口

从被调用函数返回调用函数之前,应该完成三个任务:

  • 保存被调函数的计算结果
  • 释放被调函数的数据区
  • 依照被调函数保存的返回地址将控制转移到调用函数

案例:汉诺塔问题

问题描述:有A,B,C三个塔座,A上套有n个 直径不同的圆盘,按直径从小到大叠放, 形如宝塔,编号1,2,3……n。要求将n个圆盘 从A移到C,叠放顺序不变,移动过程中遵 循下列原则:

  • 每次只能移一个圆盘
  • 圆盘可在三个塔座上任意移动
  • 任何时刻,每个塔座上不能将大盘压到小盘上

解决方法:

n=1时,直接把圆盘从A移到C
n>1时,先把上面n-1个圆盘从A移到B,然后将n 号盘从A移到C,再将n-1个盘从B移到C。即把求解n 个圆盘的Hanoi问题转化为求解n-1个圆盘的Hanoi问题。依次类推,直至转化成只有一个圆盘的Hanoi问题

main(){int m;printf("Input number of disks");scanf("Step:%3d disks ",m);hanoi(m,'A','B','C');;
}void hanoi(int n,char x,char y,char z) {if(n == 1)move(1,x,z);else {hanoi(n-1,x,z,y);move(n,x,z);hanoi(n-1,y,x,z);}}
  1. 数制转换
    在这里插入图片描述
    算法步骤:

1.初始化一个空栈S
2.当十进制N非零时,循环执行以下操作:

  • 把N与8求余得到的八进制压入栈S
  • N更新为N与8的商

3.当栈S非空时,循环执行以下步骤:

  • 弹出栈顶元素e
  • 输出e
void conversion() {//对于任意一个非负十进制数 打印输出与其值等值的八进制数InitStack(S); //初始化空栈cin>>N; //或 scanf("%d",N);while(N)    //当N非零时 循环Push(S,N%8);        //将N与8求得的余数压入栈SN = N/8;            //N更新为N与8的商while(!StackEmpty(S)) //当栈S非空时 循环Pop(s,e);       //弹出栈顶元素cout<<e;        //输出e或printf("%d",e);}
  1. 括号匹配检验

假设在表达式中 ([]())或[([][])] 等为正确的格式, [(])或([())或(()]) 均为不正确的格式。

算法的设计思想:

1.凡是出现左括号 则进栈
2.凡是出现右括号 首先检查栈是否为空 。如果栈为空则表明该右括号多余;否则和栈顶元素比较:如果匹配则左括号出栈,否则表明不匹配
3.表达式检验结束时:若栈空,则表明表达式中匹配正确;否则表明左括号有余

两种实现:

Status matching() {InitStack(S);flag = 1;cin>>ch;while(ch!='#' && flag) {switch(ch) {case '[' || '(':Push(S,ch); break;case ')':if(!StackEmpty(S) && GeTop(S)='(')Pop(S,x);elseflag = 0;break;case ']':if(!StackEmpty(S) && GeTop(S)='[')Pop(S,x);elseflag = 0;break;}cin>>ch;}if(StackEmpty(S) && flag) return TRUE;else{return FALSE;}}
Status matching(string exp) {int state = 1;while(i<=Length(exp) && state) {switch(exp[i]) {case "(" || "[":Push(S,exp[i]);i++;break;case ")":if(!StackEmpty(S) && GeTop(S)="(") {Pop(S,e);i++;}else{state = 0;}break;case "]":if(!StackEmpty(S) && GeTop(S)="[") {Pop(S,e);i++;}else{state = 0;}break;}if(StackEmpty(S) && state) return TRUE; else return FALSE;}
}
  1. 回文游戏

顺读与逆读字符串一样
算法:

  • 读入字符串
  • 压入栈
  • 原串字符与出栈字符依次比 较,若不等,非回文;若直到栈空都相等,回文。
Status palindrome(char str[],int n) {//回文游戏for(i = 0; i<n; i++) Push(S,str[i]);for(i = 0; i<n; i++){Pop(S,ch);if(str[i] != ch)return FALSE;}return TRUE;
}
  1. 迷宫求解
    问题:

这是实验心理学中的一个经 典问题,心理学家把一只老鼠从一 个无顶盖的大盒子的入口处赶进迷 宫。迷宫中设置很多隔壁,对前进 方向形成了多处障碍,心理学家在 迷宫的唯一出口处放置了一块奶酪, 吸引老鼠在迷宫中寻找通路以到达 出口。

求解思想:回溯法

回溯法是一种不断试探且及时纠正错误的搜索 方法。下面的求解过程采用回溯法:
从入口出发,按某一方向向前探索,若能走通 (未走过的),即某处可以到达,则到达新点,否 则试探下一方向; 若所有的方向均没有通路,则沿原路返回前一 点,换下一个方向再继续试探, 直到所有可能的通路都探索到,或找到一条通 路,或无路可走又返回到入口点。

在求解过程中,为了保证在到达某一点后不能 向前继续行走(无路)时,能正确返回前一点以便 继续从下一个方向向前试探,则需要用一个栈保存 所能够到达的每一点的下标及从该点前进的方向。

需要解决的问题:

1.表示迷宫的数据结构
2.试探方向
3.栈的设计
4.防止重复到达某点,避免发生死循环

1/表示迷宫的数据结构:

设迷宫为m行n列,利用maze[m][n]来表示一个迷宫, maze[i][j]=0或1;其中:0表示通路,1表示不通,当从某 点向下试探时,中间点有4个方向可以试探,见下图,而 四个角点有2个方向,其它边缘点有3个方向,为使问题简 单化我们用maze[m+2][n+2]来表示迷宫,而迷宫的四周的 值全部为1。这样做使问题简单了,每个点的试探方向全 部为4,不用再判断当前点的试探方向有几个,同时与迷 宫周围是墙壁这一实际问题相一致
在这里插入图片描述
入口坐标为(1,1),出口坐标为(m,n)

//迷宫的定义:
#define m 6     /*迷宫的实际行*/#define n 8		/*迷宫的实际列*/int maze[m+2][n+2];

2/试探方向

在上述表示迷宫的情况下,每个点有4个方向去试探。

如当前点的坐标(x,y),与其相邻的4个点的坐标都可根 据与该点的相邻方位而得到。因为出 口在(m,n),因此试探顺序规定为:从当前位置 向前试探的方向为从正东沿顺时针方向进行。

为了简化问题,方便的求出新点的坐标,将从正东开 始沿顺时针进行的这4个方向的坐标增量放在一个结 构数组move [ 4 ]中,在move 数组中,每个元素有两 个域组成,x:横坐标增量,y:纵坐标增量。

在这里插入图片描述
3/栈的设计

当到达了某点而无路可走时需返回前一点,再从前一点开始向下一个 方向继续试探。

因此,压入栈中的不仅是顺序到达的各点的坐标,而且还要有从前一 点到达本点的方向和本通道块在路径中的序号。

栈中元素的类型定义:

typedef struct {int no;     //通道块在路径上的序号PosType seat;       //通道块在迷宫中的坐标位置int d;          //从此通道走向下一通道块的方向}SElemType;// 其中PosType 为结构体
typedef struct {int x;int y;
}PosType;

4/防止重复到达某点 避免发生死循环

一种方法是另外设置一个标志数组mark[m][n], 它的所有元素都初始化为0,一旦到达了某一点 ( i, j )之后,使mark[i][j] 置1,下次再试探这个位 置时就不能再走了

另一种方法是当到达某点(i, j)后,使maze[i][j] 置-1,以便区别未到达过的点,同样也能起到防 止走重复点的目的。

砖家建议使用后一种方法,因为可以在算法结束前恢复原迷宫

设定当前位置的初值为入口位置
do {若当前位置可通则{将当前的位置插入栈顶;   //纳入路径若该位置是出口位置,则结束;    //求得路径放在栈中否则切换当前位置的东临方块为行的当前位置;}否则,若栈不空且栈顶位置尚有其他方向未经探索,则设定新的当前位置为沿顺时针方向旋转找到的栈顶位置的下一块邻块;若栈不空但栈顶位置的四周均不可通, 则{删去栈顶位置;//从路径中删去该通道块 若栈不空,则重新测试新的栈顶位置,直到找到一个可通的相邻快或出栈至栈空;}
}while(栈不空)

具体算法:

Status MazePath(MazeType maze,PosTpe move,PosType start,PosType end) {InitStack(S);curpos = start;no = 1;do{if(pass(curse)) {  //当前位置可以通过(未走过的通道块)maze[curse.x][curse.y] = -1; // 留下足迹temp = (no.curse,0);        Push(S,temp);               //加入路径if(curse == end) return TRUE;            //到达终点,出口curpos.x=curpos.x+move[temp.d].x; curpos.y=curpos.y+move[temp.d].y; //下一位置是当前位置的东邻 no++;//探索下一步 }else        //当前位置不能通过{if(!StackEmpty(S)){ Pop(S,temp); while(temp.d==3&&!StackEmpty(S)){ maze[temp.seat.x][temp.seat.y]=0; pop(s,temp);no--;//迷宫中数据还原,并退回一步 }if(temp.d<3){ temp.d++;Push(S,temp);//换下一个方向探索 curpos.x=temp.seat.x+move[temp.d].x; curpos.y=temp.seat.y+move[temp.d].y; //设定当前位置是该方向上的相邻块 }}}}while(!StackEmpty(S));return FALSE;
}
  1. 表达式求值
    转换规则及算法:

需要两个栈:对象栈s1和运算符栈s2。当自左至 右扫描表达式的每一个字符时,若当前字符是运 算对象,入对象栈

是运算符时,若这个运算符比栈顶运算符高则入 栈,继续向后处理

若这个运算符比栈顶运算符低则从对象栈出栈两 个运算量,从运算符栈出栈一个运算符进行运算, 并将其运算结果入对象栈,继续处理当前字符, 直到遇到结束符。

运算符的优先关系:
在这里插入图片描述

算法步骤:
设定两栈:OPND-----操作数或运算结果OPTR------运算符

①初始化OPTR栈和OPND栈,将表达式起始符“#”压入OPTR栈。
②扫描表达式,读入第一个字符ch,如果表达式没有扫描完毕至“#”或 OPTR的栈顶元素不为“#”时,则循环执行以下操作:

  • 若ch不是运算符,则压入OPND栈,读入下一字符ch
  • 若ch是运算符,则根据OPTR的栈顶元素和ch的优先级比较结果,做 不同的处理:
    • 若是小于,则ch压入OPTR栈,读入下一字符ch;
    • 若是大于,则弹出OPTR栈顶的运算符,从OPND栈弹出两个数,进行 相应运算,结果压入OPND栈,继续处理当前字符;
    • 若是等于,则OPTR的栈顶元素是“(”且ch是“)”,这时弹出OPTR栈顶 的“(”,相当于括号匹配成功,然后读入下一字符ch

③ OPND栈顶元素即为表达式求值结果,返回此元素。

在这里插入图片描述

OperandType  EvaluateExpression( ) { InitStack (OPTR);  Push (OPTR,'#') ; InitStack (OPND);  ch = getchar( ); while (ch!= '#' || GetTop(OPTR)! = '#') { if (! In(ch)){Push(OPND,ch); ch = getchar(); }  // ch不是运算符则进栈 else switch (Precede(GetTop(OPTR),ch)) { //比较优先权 case '<' :    //当前字符ch压入OPTR栈,读入下一字符ch Push(OPTR, ch);  ch = getchar();  break; case '>' :    //弹出OPTR栈顶的运算符运算,并将运算结果入栈 Pop(OPTR, theta); Pop(OPND, b);  Pop(OPND, a); Push(OPND, Operate(a, theta, b)); break; case '=' :    //脱括号并接收下一字符 Pop(OPTR,x);    ch = getchar();   break; } // switch 
} // while 
return GetTop(OPND);} // EvaluateExpression

示例:

表达式“3 * 2^(4+2 * 2-1* 3)-5” 求值过程
在这里插入图片描述
后缀表达式求值步骤:
1、读入表达式一个字符
2、若是操作数,压入栈,转4
3、若是运算符,从栈中弹出2个数,将运算结果再压入栈
4、若表达式输入完毕,栈顶即表达式值; 若表达式未输入完,转1

在这里插入图片描述
为了简单起见,这里的数都是一位整数,运算只含加减乘除且后缀表达式是合法的:

Float Postexpression(char *exp){ InitStack(S);i=0; While (i<length(exp)) {Switch  (exp[i]++) Case “0”: case1: Case ”2: Case  ”3: Case ”4: Case  ”5: Case  ”6:case7: Case ”8: Case ”9:Push(S,exp[i]);break; Case  “+:Pop(S,op1);Pop(S,op2);res=op1 + op2;Push(S,res);break; Case  ”-:Pop(S,op1);Pop(S,op2);res=op1 -op2;Push(S,res);break; Case  ”*:Pop(S,op1);Pop(S,op2);res=op1 *op2;Push(S,res);break; Case  ”/:Pop(S,op1);Pop(S,op2);res=op1 / op2;Push(S,res);break; } Pop(S,res);return res;
}

http://chatgpt.dhexx.cn/article/UBrpT31b.shtml

相关文章

遥感影像百分比线性拉伸

AI Earth地球科学云平台开发者模式提供了丰富的遥感数据和函数计算能力&#xff0c;下面介绍结合AIE Notebook&#xff0c;实现遥感数据的百分比线性灰度拉伸。 本期开发者实践案例——遥感影像百分比线性拉伸 灰度拉伸 (GrayScale Stretch) 是遥感影像处理过程中的重要步骤&…

遥感影像分类方法

最初的遥感影像分类是通过目视解译(濮静娟, 1984)来完成的&#xff0c;对研究人员的主观意识有较强的依赖性&#xff0c;而且效率较低&#xff0c;适用于数据量较小的情况&#xff0c;通常作为其他方法对比的对象。目前的遥感图像分类主要以计算机分类为主&#xff0c;因此按照…

遥感影像配准

文章目录 前言步骤1.ENVI&#xff1a;打开Image Registration Workflow2.Image Registration Workflow(1)选择GF2为Base Image File&#xff0c;某季节Sentinel2为Warp&#xff0c;然后Next(2)修改该参数为100(3)人为选择5个左右控制点&#xff0c;然后Next(4)删除离谱点(5)在E…

遥感图像分类技术

什么是遥感图像分类技术&#xff1f; 图像分类是将土地覆盖类别分配给像素的过程。例如&#xff0c;这9个全球土地覆盖数据集将图像分为森林、城市、农业和其他类别。 https://gisgeography.com/free-global-land-cover-land-use-data/ 一般来说&#xff0c;这是遥感中的三种主…

遥感图像分类

遥感图像分类 一、背景简介 遥感图像分类就是利用计算机通过对遥感图像中各类地物的光谱信息和空间信息进行分析&#xff0c;选择特征&#xff0c;将图像中各个像元按照某种规则或算法划分不同的类别&#xff0c;然后获得遥感图像中与实际地物的对应信息&#xff0c;从而实现…

WorldView卫星遥感影像数据/米级分辨率遥感影像

数据样例&#xff1a;百度云下载链接&#xff1a;https://pan.baidu.com/s/17ofPwpDM3OCHnE-LuhvUp 提取码&#xff1a;i0m4 目前世界上最常用的高分辨率卫星影像莫过于WORLDVIEW系列了&#xff0c;在卫星遥感圈内可谓大名鼎鼎&#xff0c;不仅具有超高的分辨率还具有其他高分…

遥感数据下载平台汇总

1中国资源卫星应用中心http://www.cresda.com.cn中巴卫星、HJ星、ZY系列 、GF系列2中科院对地观测与数字地球科学中心http://ids.ceode.ac.cn/Index.aspxERS卫星&#xff0c;Enviset_1卫星&#xff0c;法国的spot4卫星&#xff0c;中巴资源卫星&#xff0c;landset-5-73地球系统…

遥感多光谱数据下载与预处理(一、数据选择 下载)

首先说明本人并非专业大牛&#xff0c;不是教程贴只是记录一下学习过程和大家交流&#xff0c;过程有不严谨不合规范不对的地方欢迎各位大神指正。 本人目前做过接触过最多的是多光谱遥感数据&#xff0c;也是与无人机、雷达、高光谱等相比最简单的一种&#xff0c;这是我自己总…

地理空间数据云下载遥感影像

目录 1、先上网址&#xff1a;www.gscloud.cn 2、介绍界面&#xff1a; 2.1 “数据资源” 2.2 “高级检索” 1、先上网址&#xff1a;www.gscloud.cn 2、介绍界面&#xff1a; 地理空间数据云&#xff0c;作为国内免费下载遥感卫星影像的一个大平台&#xff0c;随着年代发…

遥感图像入门

遥感图像入门 一、 遥感基本概念地物光谱特性3S 技术瑞利散射大气窗口 二、 遥感系统的组成三、 遥感分类四、 遥感数字图像处理图像与数字图像数字图像获取时的基本参数数字图像类型 一、 遥感基本概念 遥感(Remote Sensing)——遥远的感知&#xff0c;在未接触物体的情况下获…

遥感影像的几何校正

一、引言&#xff08;INTRODUCTION&#xff09; 图像校正主要是指辐射校正和几何校正。辐射校正包括传感器的辐射校正、大气校正、照度校正遗迹条纹和斑点的判定和消除。几何校正就是校正成像过程中造成的各种几何畸变&#xff0c;包括几何粗校正和几何精校正。几何粗校正是针对…

遥感影像数据下载网站整理

遥感影像数据下载网站整理 1 遥感影像数据1.1 综合遥感数据1.1.1 USGS EarthExplore1.1.2 LAADS DAAC1.1.3 Copernicus Open Access Hub1.1.4 GloVis1.1.5 地理空间数据云 1.2 雷达遥感数据1.2.1 ASF DAAC 1.3 夜光遥感数据1.3.1 NOAA EOG1.3.2 珞珈一号 1.4 海洋卫星数据1.4.1…

高分GF与环境HJ系列国产卫星遥感影像数据图像免费批量下载方法

本文介绍高分&#xff08;GF&#xff09;与环境&#xff08;HJ&#xff09;等主要国产卫星遥感数据的免费下载&#xff08;包括批量下载&#xff09;方法。 首先&#xff0c;进入中国资源卫星应用中心官网&#xff1a;http://www.cresda.com/CN/。选择“查询系统”。 随后登录系…

【随笔】那些免费友好的遥感影像数据下载网站

1 .影像数据 1.1 地理空间数据云 推荐指数&#xff1a;❤❤❤❤❤交互界面&#xff1a;友好传输速度&#xff1a;0.4m/s数据集&#xff1a;开源数据集较为丰富&#xff0c;Landsat系列数据及DEM数据较丰富&#xff0c;但也有一些数据无法下载。 网址&#xff1a;地理空间数据…

完全免费的在线遥感影像下载器-转载

链接&#xff1a;link 转载学习使用&#xff0c;可免费下载&#xff01;

常用遥感数据下载平台

国内常用卫星数据下载网站 1&#xff0c;AI Earth 地球科学云平台 网址&#xff1a;AI Earth 数据&#xff1a;Landsat、Sentinel、MODIS、地形数据。 2&#xff0c;地理空间数据云 网址&#xff1a;http://www.gscloud.cn/ 数据&#xff1a;多种卫星数据 3&#xff0c;中…

Landsat遥感影像下载

摘要&#xff1a;本篇文章主要介绍下载遥感卫星影像数据常用的几种的获取方法。适合刚接触遥感这个领域不久却需要下载和使用遥感影像的人群。 本文着重介绍陆地资源卫星Landsat系列卫星的遥感影像查询和下载。 目录 1、陆地资源卫星Landsat系列卫星基本介绍 1.1 Landsat-5介绍…

遥感图像下载指南

文章目录 1、高分系列&#xff08;收费&#xff09;1.1 下载方式&#xff08;1&#xff09;&#xff1a;登录中国资源卫星应用中心1.2 下载方式&#xff08;2&#xff09;&#xff1a;登录数据分发系统 2、GOCI图像下载说明(免费),登录韩国海洋卫星中心3、MODIS图像下载4 、附录…

遥感数据下载网站

【补充1&#xff1a;】ASF DACC 12.5m的dem 数据&#xff08;https://search.asf.alaska.edu/#/&#xff09; 只需要注册一个账号就免费下载&#xff0c;Sentinel-1&#xff0c;ALOS PALSAR和其他SAR数据是开放访问的。可能需要cross wall。 【补充2&#xff1a;】陆地观测卫…

【保姆级教学】Landsat遥感影像下载

摘要&#xff1a;本篇文章主要介绍下载遥感卫星影像数据常用的几种的获取方法。适合刚接触遥感这个领域不久却需要下载和使用遥感影像的人群。 本文着重介绍陆地资源卫星Landsat系列卫星的遥感影像查询和下载。 目录 1、陆地资源卫星Landsat系列卫星基本介绍 1.1 Landsat-5…