找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 4337|回复: 36

[选择集] 通用堆栈数据结构---入栈函数

[复制链接]

已领礼包: 51个

财富等级: 招财进宝

发表于 2013-6-6 00:45:26 | 显示全部楼层 |阅读模式
函数发布
函数名称: XD::Stack:PUSH
调用格式: (XD::Stack:PUSH name element)
参数说明: name --- 堆栈名
element --- 元素 (INT,REAL,SRING,LIST...)
返回值: T
函数简介: 通用堆栈数据结构---入栈函数
函数来源: 原创
函数作者: Lispboy
适用版本: 不限 
最后更新时间: 2013-06-06
备注: -
演示图片: -

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
游客,本帖隐藏的内容需要积分高于 50 才可浏览,您当前积分为 0


示例:
  1. (xd::stack:push "Var1" 34)
  2. T
  3. (xd::stack:list "Var1")
  4. (34)
  5. (xd::stack:push "Var1" '(23 45))
  6. T
  7. (xd::stack:list "Var1")
  8. ((23 45) 34)
  9. (xd::stack:push "Var1" "abc")
  10. T
  11. (xd::stack:list "Var1")
  12. ("abc" (23 45) 34)



在计算机领域,堆栈是一个不容忽视的概念,但是很多人甚至是计算机专业的人也没有明确堆栈其实是两种数据结构。堆栈都是一种数据项按序排列的数据结构,只能在一端(称为栈顶(top))对数据项进行插入和删除。要点:堆,顺序随意。栈,后进先出(Last-In/First-Out)。

0.jpg

1.jpg
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2013-6-6 01:04:48 | 显示全部楼层
这就是一个概念问题,ALisp 是表

Lst =〉 ((k1 d11 d12 .... d1n) (k2 d21 d22 ....  d2n) ... (kn dn1 dn2 ... dnn))

if => (assoc k1 lst)  => (subst (cons (cons  k1 (cons newindex (cdr (assoc k1 lst))))  (assoc k1 lst) lst)

核心是有关键字的一个全局变量表

点评

函数是个黑匣子,里面确实是表实现的,LISP做这个数据结构有天然优势,但理解它就不要再想表了,它是一个封装的结构。 ALISP/VLISP都是程序设计语言,堆栈属于数据结构,任何设计语言都需要用它来完成 First-in/L  详情 回复 发表于 2013-6-6 01:56
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 51个

财富等级: 招财进宝

 楼主| 发表于 2013-6-6 01:56:32 | 显示全部楼层
Free-Lancer 发表于 2013-6-6 01:04
这就是一个概念问题,ALisp 是表

Lst =〉 ((k1 d11 d12 .... d1n) (k2 d21 d22 ....  d2n) ... (kn dn1  ...

函数是个黑匣子,里面确实是表实现的,LISP做这个数据结构有天然优势,但理解它就不要再想表了,它是一个封装的结构。

ALISP/VLISP都是程序设计语言,堆栈属于数据结构,任何设计语言都需要用它来完成 First-in/Last Out做的事。

一个具体应用就是能随时保存程序当时的环境,需要的时候恢复状态。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2013-6-6 06:52:58 来自手机 | 显示全部楼层
用堆,桟规则存取的表(如果在autocad alisp可以读取),莫非这个数据就像(xdrx_setenttodb e)在arx定义的空间,不像lisp的全局变量来自: Android客户端

点评

”栈“不是数据类型,而是储存”各种数据类型“的容器,遵循着 后进先出 的规则,是"数据结构”,里面的数据类型可以任意,他把LISP的全局变量等保存起来,永远只能用最顶上的变量,弹出后,才能对第二个变量进行操  详情 回复 发表于 2013-6-7 01:40
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 6530个

财富等级: 富甲天下

发表于 2013-6-6 08:42:59 | 显示全部楼层
个人以为,楼主的堆栈概念错了,不是定义错了,而是在AutoLisp中就没有堆栈这个概念。
Alisp是表结构,对数据表而言,只要你方法得当,你可以在任意位置存取任意数据,从这个概念来说,这是“堆”,从Alisp的单进程运行方式而言,符合后进先出的“栈”的概念,但无论如何也无法构建一个后进先出的数据表,哪怕是选择集,仍旧可以通过句柄等索引,得到任意位置的数据。

点评

还得再说两句, 你定义个表,然后对这个表定义一些函数,函数只能用CAR(出栈),CDR (弹出栈顶元素),你把这个表和实现的函数给编译封装了,别人不知道是什么了,你只给他 CAR 的那个 函数,不就是后进先  详情 回复 发表于 2013-6-7 01:45
还是没有理解我的想法,我不是要把LISP硬加个堆栈,而是用LISP表封装一个 后进先出的 数据结构。 没有任何一个语言本身就有堆栈,都是通过数据类型去封装一个结构,用具体算法去实现栈的特点的操作,C++可以实现  详情 回复 发表于 2013-6-7 01:31
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2013-6-6 17:15:20 | 显示全部楼层
图片好清晰。{:soso_e179:} 个人认为ALISP的表两个都像,既像数据表又像数组
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 51个

财富等级: 招财进宝

 楼主| 发表于 2013-6-7 01:31:15 | 显示全部楼层
本帖最后由 Lispboy 于 2013-6-7 01:51 编辑
ll_j 发表于 2013-6-6 08:42
个人以为,楼主的堆栈概念错了,不是定义错了,而是在AutoLisp中就没有堆栈这个概念。
Alisp是表结构,对 ...

还是没有理解我的想法,我不是要把LISP硬加个堆栈,而是用LISP的一个数据类型”表“封装一个 后进先出的 数据结构。正如C++的指针一样。

没有任何一个语言本身就有堆栈,都是通过数据类型去封装一个结构,用具体算法去实现栈的特点的操作,C++可以实现,LISP一样,只是一个用数据类型和算法支撑的一个叫”栈“的数据结构。这个结构,永远只能对栈顶元素进行操作。保存环境,变量嵌套使用每层次操作互不冲突,只能使用”栈“这个结构。

上面这个栈函数,你现在能看到表的变量,可以随意提取表其他元素,如果我把函数编译了,你还能随意提取出来除了栈顶的其他元素吗? 不能。只能用我提供的POP函数弹出CAR。剩下CDR。

具体看看 http://bbs.xdcad.net/thread-668680-1-1.html 这个帖子的系统变量应用。这个系统变量的嵌套定义恢复只是这个”栈“结构的一个应用,在这个通用模板下的栈,还可以实现其他的,比如实体栈,在多重选择集操作时候,永远对栈顶实体进行操作,可以简化很多代码。以后我会陆续提供这样的函数的。

这个后进先出的结构, 就是让用户只能对第一个元素进行操作,不用就弹出去,第二个冒出来。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 51个

财富等级: 招财进宝

 楼主| 发表于 2013-6-7 01:40:14 | 显示全部楼层
Free-Lancer 发表于 2013-6-6 06:52
用堆,桟规则存取的表(如果在autocad alisp可以读取),莫非这个数据就像(xdrx_setenttodb e)在arx定义的空 ...

”栈“不是数据类型,而是储存”各种数据类型“的容器,遵循着 后进先出 的规则,是"数据结构”,里面的数据类型可以任意,他把LISP的全局变量等保存起来,永远只能用最顶上的变量,弹出后,才能对第二个变量进行操作。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 51个

财富等级: 招财进宝

 楼主| 发表于 2013-6-7 01:45:15 | 显示全部楼层
本帖最后由 Lispboy 于 2013-6-7 02:39 编辑
ll_j 发表于 2013-6-6 08:42
个人以为,楼主的堆栈概念错了,不是定义错了,而是在AutoLisp中就没有堆栈这个概念。
Alisp是表结构,对 ...

还得再说两句,

但无论如何也无法构建一个后进先出的数据表

你定义个表,然后对这个表定义一些函数,函数只能用CAR(出栈),CDR (弹出栈顶元素),你把这个表和实现的函数给编译封装了,别人不知道是什么了,你只给他 CAR 的那个 函数,不就是后进先出了吗? 用户不知道表是啥变量,他就不可能去对他实现 CDDR等操作。他只能按照你的意思用CAR和CDR。

表不是说AUTOLISP自己内部实现,表只是数据类型之一,你上面做的过程是封装了一个结构,“栈”是算法和数据结构研究的范畴,其他语言只是用自己的适合的数据类型去实现这个结构,用C++的概念讲,封装个“类”,包括了数据和实现的方法。这个结构是可以“后进先出”的。
对上面封装的“栈”,用LISP解释操作:
cons ---  入栈 PUSH
car  ----  栈顶元素 TOP
cdr ----  栈顶元素出栈 POP
你只提供给用户这三个接口。


论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 6530个

财富等级: 富甲天下

发表于 2013-6-7 10:00:58 | 显示全部楼层
Lispboy 发表于 2013-6-7 01:45
还得再说两句,

大概是本人脑拙,实在不敢苟同阁下的观点。
Lisp本身就是表结构语言,基本出发点就是“表”,所有变量、函数等都是以表来表现和处理的,表结构数据的主要长处就是自由,现在放弃这个长处,去一味追求什么后进先出,是不是有点舍本求末?
由于受AutoCAD的限制,AutoLisp是单进程,所以在函数调用时,采用堆栈已经是不得已,阁下反而自己去追求“堆栈”,真不知道是为了什么?
观阁下的入栈函数,也不过是构建一个有索引的二维表#XD::DataStru:Stacke而已,只要语法得当,完全可以不受“栈”规则的约束,访问表中的任意数据,还有什么后进先出可言?
如果必须用Lisp的表结构来构建符合“栈”规则的数据结构,只有把先入的数据“包裹”在后入的数据中,构成如:(a1 (a2 (a3 (a4 ...))))这样的表,只有这种表才符合栈的规则,进、出都得“层层剥皮”,不过这种表显然是找“死”,再大的堆栈空间也很快会被“压”满的。

点评

不管你怎么用 LISP 表(这里说的表示数据类型) 如何组合去处理“栈”,你要保证你的那个表, AR是栈顶元素,CDR是弹出栈顶元素剩下的栈,CONS是入栈就行了。 对栈没有CADR,弹出CAR...不断的弹出CAR,只有弹出一个  详情 回复 发表于 2013-6-7 11:00
还是没仔细看完我的所有回帖。 长老把数据类型 和数据结构 混淆了。 我说了,如果我把函数编译了,你还能随意去取这个“栈结构”的任意元素吗?你只能按照我给你的PUSH,TOP,POP接口去存取里面的数据。 现在  详情 回复 发表于 2013-6-7 10:55
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 51个

财富等级: 招财进宝

 楼主| 发表于 2013-6-7 10:55:02 | 显示全部楼层
ll_j 发表于 2013-6-7 10:00
大概是本人脑拙,实在不敢苟同阁下的观点。
Lisp本身就是表结构语言,基本出发点就是“表”,所有变量、 ...

还是没仔细看完我的所有回帖。

长老把数据类型 和数据结构 混淆了。

我说了,如果我把函数编译了,你还能随意去取这个“栈结构”的任意元素吗?你只能按照我给你的PUSH,TOP,POP接口去存取里面的数据。

现在它没编译,你要当它是个“黑匣子”,用户只能用提供出来的接口,去完成这个“数据结构”提供的方法做的事。

请理解这个帖子具体应用和联想“它”所能带来的其他的各种变化。

http://bbs.xdcad.net/thread-668681-1-1.html

  1. 命令: tt
  2. osmode=0
  3. cmdecho=0
  4.     osmode=1
  5.     cmdecho=1
  6.         osmode=0
  7.         cmdecho=1
  8.     osmode=1
  9.     cmdecho=1
  10. osmode=0
  11. cmdecho=0
复制代码
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 51个

财富等级: 招财进宝

 楼主| 发表于 2013-6-7 11:00:04 | 显示全部楼层
ll_j 发表于 2013-6-7 10:00
大概是本人脑拙,实在不敢苟同阁下的观点。
Lisp本身就是表结构语言,基本出发点就是“表”,所有变量、 ...

不管你怎么用 LISP 表(这里说的表是数据类型) 如何组合去处理“栈”,你要保证你的那个表,CAR是栈顶元素,CDR是弹出栈顶元素剩下的栈,CONS是入栈就行了。

对栈没有CADR,弹出CAR...不断的弹出CAR,只有弹出一个,才能取得下一个,这个就是这个“数据结构”的含义。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 593个

财富等级: 财运亨通

发表于 2013-6-7 11:14:53 | 显示全部楼层
ll_j 长老是看本质,去掉马甲,你非要把这个 List 赋予另外的含义也没办法
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 6468个

财富等级: 富甲天下

发表于 2013-6-7 14:29:13 | 显示全部楼层
目前还没有办法理解“堆栈”的含义。

点评

我给你讲一下“栈”的含义 你有个代吗,两重循环比如 能看明白不? 就是(2)里你设置的系统变量,回到(1)的时候,系统变量又变成了(1)时候用的。 回到(1)外面后,(1)里面设置的变量也恢复成最初了  详情 回复 发表于 2013-6-7 15:34
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2013-6-7 15:34:37 | 显示全部楼层
sicky111 发表于 2013-6-7 14:29
目前还没有办法理解“堆栈”的含义。

我给你讲一下“栈”的含义

你有个代吗,两重循环比如

  1. while
  2. {
  3.     ...这个地方你要修改系统变量,那么为了不影响程序退出后系统环境,你要保存系统变量以后恢复(1)
  4.    push ;;入栈保存
  5.     while
  6.     {
  7.            ;在这个地方,你还需要设置系统变量,这个系统变量的作用仅仅在这个循环体部分要用到(2)
  8.            push ;;入栈保存,这个时候保存的不是程序最开始的环境,连上级循环修改的变量也保存了。
  9.            .....
  10.            pop ;;退出这个循环前,把(2)保存的环境弹出来,相当于上级循环(1)时候的环境
  11.      }
  12.      ;退出二级循环,回到上级循环,这个层次你的环境需要的是(1)时候设置的变量,
  13.      ;(2)时候设置的变量因为栈的原因,并没有影响到这级。
  14.      
  15.       POP;;退出一级循环前,弹出栈顶元素,恢复系统变量
  16. }
  17. ;到这个地方,一级循环修改的变量也恢复到原来了。


能看明白不? 就是(2)里你设置的系统变量,回到(1)的时候,系统变量又变成了(1)时候用的。
回到(1)外面后,(1)里面设置的变量也恢复成最初了。

你的程序不管用了几层循环,最终的每层代码里面的系统变量的设置是不会被下面的修改而改变的。
     
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-12-25 16:04 , Processed in 0.550777 second(s), 73 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表