汇编语言里的堆栈操作问题
- 提问者网友:我没有何以琛的痴心不悔
- 2021-07-24 13:21
- 五星知识达人网友:蕴藏春秋
- 2021-07-24 14:57
函数操作~`也会用到堆栈`
比如
push a
push b
call fun
- 1楼网友:孤老序
- 2021-07-24 15:14
并不是用来保护数据的 用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; }