找答案的高端用户(找答案钻石及双钻级别的用户)将尽可能从此问题下的所有回
答中,为您推荐最佳答案。届时您可以根据推荐数采纳答案。
如果自提问时间起7天内您仍无法选出最佳答案,您可以选择“无满意答案”关闭此问题。
问题
取消精华
首页精华问答
取消推荐
高端用户推荐
申请置评
已申请置评
修改
修改标签
添加标签
官方认证
取消官方认证
修改标签
添加标签
转移分类
删除
{{itemCategory}}
收藏({{answerDetail.Q_FavoriteCounts}})
手机扫码追踪该问题,
觉得实用,立即去分享!
点击复制链接
专家建议
取消最佳答案
修改
后进先出(堆栈)编程思路:
1、在V存储区开辟一块连续区域作为先进先出的数据区,比如说从VB100开始的100个字节;
2、假如M0.0=1时,要进行一次插入新数据操作,M0.1=1时,要进行一次取数据操作;要插入的新数据总是存在VB0中,取出的数据总是暂存在VB1中,数据区能够存储最多数据数量VW2,数据区数据量计数用VW4存储。
3、用SM0.1做初始化初始化1个指针,初始化时指针都指向VB99,初始化数据区最大空间到VW2,用来判断指写数据区的指针是否上溢了;另外可以用FILL指令初始化数据区;
MOVD &VB100,AC0 读写新数据的指针
MOVW 100,VW2 数据区可存储数据量
MOVW 0,VW4 数据区已存储数据量计数
4、M0.0的上升沿(压栈)做如下工作:
判断 VW4 是不是等于VW2,如果等于,则说明数据区已填到最后了,填写满了,不能再填了。
否则
MOVB VB0,*AC0 压栈数据存储到AC0指定的字节
INCW VW4 已压栈数据量加1;
INCD AC0 AC0指向下一个存储字节;
5、M0.1的上升沿(弹栈)做如下工作:
DECD AC0 AC0指向上一个存储单元;
DECW VW4 已压栈数据量减1;
判断 VW4 是不是小于0,如果小于零,则下溢了,不能取数数据,则恢复初始指针及计数:
MOVD &VB100,AC0 恢复指针;
MOVW 0,VW4 计数值初始化为0;
否则取弹出的数据到VB1。
MOVB *AC0,VB1
6、注意一点,数据区不停的填,但一直没有取,会造成数据区上溢出,这个设计思路并没有考虑这一点。通常的处理方法是开辟足够大的数据区。
7、按这个思路画一个草图,想通了再编写程序,今天是周未,我的CPU没带回家,不能做在线测试,周一上班时,就可以做了。
等您来回答
换一换
{{item.CoinValue}}西币
{{item.VisitNum}}人想问
本版相关问题
换一换
专家置评
首次回答问题,获得
双倍西币积分!
立即成为技术知识分享的一员!
欢迎您访问支持中心!
丰富的视频,全方位的文档,大量的网友交流精华……
为了更好的完善这些内容,我们诚邀您在浏览结束后,花20秒左右的时间,完成一个用户在线调查!
感谢您的支持!

西门子商城