永发信息网

汇编语言里的堆栈操作问题

答案:2  悬赏:0  手机版
解决时间 2021-07-24 21:43
用PUSH,POP指令执行进栈出栈操作除了用来保护数据还有什么用?压入栈中的数据能否直接调用?貌似是不能的……
最佳答案

函数操作~`也会用到堆栈`


比如


push a


push b


call fun

全部回答

并不是用来保护数据的 用C++来说吧 例如栈是先进后出的,利用这个特性我们假设用它来保存走过的路径那么先进push就被压在下面了 后push的就在上面 这样当我们要得到前一点路径的话只要取栈顶元素就可以了

堆队列 栈在实际的算法中都是有用的 例如最大堆 最小堆 堆排序

我举个(下面)我上星期写的迷宫算法的代码吧 里面用到了栈

在汇编中也是类似的,主要利用他们的特点 如队列 先进先出 栈先进后出

编译环境 visual studio 2008

//migong.h

#pragma once #include <iostream> #include <stack> #define MAX_ROW_NUM 20 #define MAX_COL_NUM 20 using namespace std; enum lxr:int{tonglu,zhangai,rukou,chukou}; //想不到名称就叫lxr typedef struct _PATHPOINT{ //用于路径栈中记忆路径坐标 int x,y; }PPOINT; typedef bool DIRECTION; typedef struct _POINT{ //用于探测路径 结构体数组执行效率高,所以不用类 int info; //该点信息 此例1为通路,0为障碍,2为入口,3为出口 DIRECTION right,down,left,up; //标记该点的4个方向是否走过 若为true则未走过否则反之 }POINT; class STACK:public stack<PPOINT>{ public: STACK(){} ~STACK(){} PPOINT backandpop(){ //返回并删除栈顶元素 PPOINT p; p=top(); pop(); return p; } }; class migong { private: int row,col; //当前的行数和列数 POINT point[MAX_ROW_NUM][MAX_COL_NUM]; STACK ps; //路径栈 public: migong(){} ~migong(){} void input(); void findpath(); void output(); PPOINT outlet(); //返回入口 };

//migong.cpp

#include "StdAfx.h" #include "migong.h" #define NP nowpoint

void migong::input() { int i,j; cout<<"请输入迷宫的行和列:"; cin>>row>>col; cout<<"请输入迷宫:1(通路),0(障碍),2(入口),3(出口)"<<endl; for(i=1;i<=row;i++){ for(j=1;j<=col;j++){ cin>>point[i][j].info; point[i][j].down=true; point[i][j].left=true; point[i][j].right=true; point[i][j].up=true; } } //建造围墙 for(j=0;j<=col+1;j++){ point[0][j].info=0; point[row+1][j].info=0; } for(i=1;i<=row;i++){ point[i][0].info=0; point[i][col+1].info=0; } } void migong::findpath() { PPOINT in,nowpoint; //in在连连看中才有实际意义 此处无意义 NP=in=outlet(); //将出口点设置为当前点 do{ if(point[NP.x][NP.y].info==rukou){ //当前点为出口 ps.push(NP); //将入口压入栈用以便输出 break; } RS: if(point[NP.x][NP.y].right && point[NP.x][NP.y+1].info){ //若右方可走 ps.push(NP); //将此点坐标压入栈中 point[NP.x][NP.y++].right=false; //标明已走过 point[NP.x][NP.y].left=false; //防止往回走 } else if(point[NP.x][NP.y].down && point[NP.x+1][NP.y].info){ //若下方可走 ps.push(NP); point[NP.x++][NP.y].down=false; point[NP.x][NP.y].up=false; } else if(point[NP.x][NP.y].left && point[NP.x][NP.y-1].info){ //若左方可走 ps.push(NP); point[NP.x][NP.y--].left=false; point[NP.x][NP.y].right=false; } else if(point[NP.x][NP.y].up && point[NP.x-1][NP.y].info){ //若上方可走 ps.push(NP); point[NP.x--][NP.y].up=false; point[NP.x][NP.y].down=false; } else{ //若无路可走 说明只能回溯 if(!ps.empty()){ //若栈非空 NP=ps.backandpop(); //返回并删除栈顶元素 goto RS; } } }while(!ps.empty()); //直到栈为空 if(!ps.empty()){ //若找到正确路径 output(); } else cout<<"无解"; } PPOINT migong::outlet() { PPOINT p; int x,y; for(x=1;x<=row;x++){ for(y=1;y<=col;y++){ if(point[x][y].info==chukou){ p.x=x; p.y=y; return p; } } } //不考虑找不到出口的情况 } void migong::output() { cout<<"走法如下:"<<endl; while(!ps.empty()){ cout<<ps.top().x<<" "<<ps.top().y<<endl; ps.pop(); } }

//main.cpp

#include "stdafx.h" #include "migong.h"

int _tmain(int argc, _TCHAR* argv[]) { int pause; migong mg; mg.input(); mg.findpath(); cin>>pause; return 0; }

我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
田地如何利用
点解结佐婚就一定要上床呢?
我的电脑还能用?
跪求一首英文歌曲,旋律有点快?
英语翻译明:古文从日.云古文作明.则朙非古文
我用EMS送个东西未妥投好几次
什么是时差症
诺基亚N82怎么不要待机模式竖栏下面几个东西
蜗居好看还是奋斗好看?那个更现实一点?
请各位说下怎么减掉脸上的肉或者取掉水肿的个
但你无法抉择的时候.该怎么半?
为什么大家不愿接受亨利他们两只呢。。
阴虱病搽好百夫康药膏就可以吗
蚂蚁和大象摔跤哪个会赢
什么办法入睡最快?
推荐资讯
问道飞升任务接了要钱么
学什么东西一定要有天分吗
oppo哪款机子比较好用?好看
橄榄油用来搽脸可以吗?
过点(-1,3)且垂直于直线X-2y+3=0的直线方程
介绍个游戏界面很好看又实用的WOW插件
最近不知怎么回事,做什么事都容易脸红,如吃
阿斗当官下一句,不认庐山真面目,下一句是什
如果被人欺负了,你会怎么做啊?
什么品牌的皮草较好和有名?
不用卸妆水 怎么样才能把眼部的妆卸干净了
我很想爱他…
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?