找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

楼主: Lispboy

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

[复制链接]

已领礼包: 6530个

财富等级: 富甲天下

发表于 2013-6-7 16:44:57 | 显示全部楼层
XDSoft 发表于 2013-6-7 15:34
我给你讲一下“栈”的含义

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

简单的问题被你们搞复杂了。
ALisp的环境其实就是Acad的环境,和其它需要编译才能执行的高级语言是不同的,而ALisp的环境其实也就是几个相关系统变量的设置,本不复杂,先保存,再恢复,即使中间过程有需要变化设置系统变量的,也只是setver一下而已,现在引出一个堆栈概念,看似高深,实际上我认为有点什么(我想不起来词了,总之太过),对大家真正学习和理解ALisp并不有利。

点评

这是一个数据结构,换做其他语言编程,也是这样用,只是不同语言实现的方法不同。没什么复杂的啊,系统变量这个仅仅是一个应用,联想下,可能会有很多更“宽广”的应用。 不是在LISP引出“堆栈”,数据结构是独立  详情 回复 发表于 2013-6-7 17:04
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 51个

财富等级: 招财进宝

 楼主| 发表于 2013-6-7 17:04:46 | 显示全部楼层
本帖最后由 Lispboy 于 2013-6-7 17:48 编辑
ll_j 发表于 2013-6-7 16:44
简单的问题被你们搞复杂了。
ALisp的环境其实就是Acad的环境,和其它需要编译才能执行的高级语言是不同 ...

这是一个数据结构,换做其他语言编程,也是这样用,只是不同语言实现的方法不同。没什么复杂的啊,系统变量这个仅仅是一个应用,联想下,可能会有很多更“宽广”的应用。

不是在LISP引出“堆栈”,数据结构是独立于编程语言的,算法是基础,数据结构是桥梁。一个程序如果有好的数据结构,实现流程会更清晰,代码维护会更便捷。

封装到上面这个栈结构后的代码,就是这样,使用方便,代码维护方便。

长老,你用传统的面向过程的思路,是可以做到我做的这个“栈”结构能做的事,其实本质上的代码是一样的,不过是CAR,CDR,但是程序代码多的时候,时间过去很久的时候,你知道哪个变量,哪个层次是怎么保存的吗,修改下实现方式你要修改很多代码,还不保证会不会“落下”需要改的地方。

而封装后的,只需要修改下关联表的名字部分即可。封装后,用户只需要知道接口函数即可。另外封装里面的代码,也不长啊,这部分代码,如果按你的,你要贴到很多地方。

你如果实现也能实现,但是别人可能看不懂你想做的。如果换一种应用呢?不是保存系统变量了,而是保存实体数据了,你还要再写代码。

再次声明,我不是强给LISP加上堆栈,堆栈和语言无关,堆栈是数据结构。用“堆栈”是一种编程思想,用数据结构去组织代码流程,和递归一样,不依赖于具体语言。
实际上,这个栈就是几个子函数而已,方便组织栈这种后进前出的数据。

并没有什么搞复杂了,反而很清晰,保存的时候 PUSH,恢复的时候POP,仅次而已,并没对什么初学者造成困难,况且这个是在写通用的函数。
想法,给初学者介绍写栈的面向对象和重视数据结构组织数据的思想,反而对他们有帮助。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 6530个

财富等级: 富甲天下

发表于 2013-6-7 17:58:56 | 显示全部楼层
在面向过程的Lisp语言中去强化面向对象才使用的概念,是不是有点跑偏了?

实际上,你所说的栈,无非还是一个数据表,和其它的数据表没什么区别,栈的操作无非还是一个函数,和其它针对表的操作没什么区别,那么,何必非要用这种特殊的名称去描述呢?

Lisp函数嵌套的过程其实就是使用堆栈和闭包的,但不要认为就一定要特别处理这些。

说到编译,Lisp的一个思想就是“无论什么时候,整个语言都是可用的。Lisp并不真正区分读取期、编译期和运行期。你可以在读取期编译或运行代码;也可以在编译期读取或运行代码;还可以在运行期读取或者编译代码。”从这种意义上来说,以编译后的模块来说事,实质上是说不通的,不管什么样的代码,编译后你都看不到它原本是什么。

总之,你使用堆栈这种编程思想来“命名”面向过程的“表”是不合适的,至少说是不先进的。

好了,这个话题我不想再多说了,在我看,那就是表和函数,没有什么特别的。

点评

LISP所有的东西都是表啊,是没什么的啊,但你所写的每个函数也都作用不同啊,你可能完成画圆,我这个完成”后进先出“的保存数据。怎么就非得强加给它什么呢? 1、我这个确实是表 2、也是  详情 回复 发表于 2013-6-7 18:16
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 51个

财富等级: 招财进宝

 楼主| 发表于 2013-6-7 18:16:54 | 显示全部楼层
ll_j 发表于 2013-6-7 17:58
在面向过程的Lisp语言中去强化面向对象才使用的概念,是不是有点跑偏了?

实际上,你所说的栈,无非还是 ...

{:soso_e114:} LISP所有的东西都是表啊,是没什么的啊,但你所写的每个函数也都作用不同啊,你可能完成画圆,我这个完成”后进先出“的保存数据。怎么就非得强加给它什么呢?

    1、我这个确实是表
    2、也是一个子函数
    3、这个函数我给用户编写的只能取表的第一个元素。
    4、它能完成后进先出的组织数据。
    5、他能根据不同的关键字,建立不同的关联表。

这个是我这个数据结构想表达的,你叫它啥? 堆栈不喜欢,那就要货栈,酒瓶,羽毛球筒..... 它是能描述从羽毛球筒取羽毛球出来的一种”表“。也是描述应用中类似”取羽毛球“这种操作的一个封装的”表“。

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

使用道具 举报

发表于 2013-6-7 18:52:32 | 显示全部楼层
1、这个东西还是容易把人搞糊涂! 这次我是支持长老来的!呵呵

2、LISPBOY把简单的问题复杂化了。lisp里的表本来就是按需要的顺序排列的表。
     我们不仅能对其元素“先进后出”,我们也可以对其“先进先出”(reverse下表).

3、lispboy的函数只取其表的“先进后出”特性。抛弃了它“先进先出”的特性。

其实表本是个窄长的房间,两头都开了门。  而lispboy生生的把一个门堵了,还挂个牌子叫地道。
          大家觉的是两个门方便还是一个门方便呢?!

点评

你以前说过的那个水管子的数据保存问题,就是用这个来解决的,想想你那个水管子: PUSH PUSH PUSH ;;这个地方是你的树叶子了 POP POP POP 上面每层你计算的数据都会安全保存  详情 回复 发表于 2013-6-7 19:18
函数不还在继续写呢吗? 我有没说以后所有对表的操作都用这个栈了,这个只是在完成需要”后进先出“处理数据时候的一个”子函数“。这样理解吧。 以后还有”队列“,去完成”先进先出“那种数据组织方式。 具  详情 回复 发表于 2013-6-7 18:59
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 51个

财富等级: 招财进宝

 楼主| 发表于 2013-6-7 18:59:52 | 显示全部楼层
本帖最后由 Lispboy 于 2013-6-7 19:02 编辑
wowan1314 发表于 2013-6-7 18:52
1、这个东西还是容易把人搞糊涂! 这次我是支持长老来的!呵呵

2、LISPBOY把简单的问题复杂化了。lisp里 ...

函数不还在继续写呢吗? 我有没说以后所有对表的操作都用这个栈了,这个只是在完成需要”后进先出“处理数据时候的一个”子函数“。这样理解吧。

以后还有”队列“,去完成”先进先出“那种数据组织方式。

具体用什么,具体用到哪里根据用户自己的需要。

声明下,这些都是LISP的子函数,还真不能讲太深了。

我哪里把什么们赌死了,你对求交点的函数,不能要求它算填充面积吧? 我这个一样,我只是让这个子函数去取表头数据的子函数而已。其他理解吧。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

发表于 2013-6-7 19:02:00 来自手机 | 显示全部楼层
LZ如果说这个LIST是按特定规则使用估计大家就接受了

点评

这么说可能更不行了,他们认为我妨碍了什么 什么也没妨碍了,我只是个”求交点“的函数,不会影响到”求填充“的函数吗? 我是想把数据结构的思想和概念引进来,让他们知道临时保存变量,随时恢复时候需要怎么  详情 回复 发表于 2013-6-7 19:13
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

发表于 2013-6-7 19:12:39 来自手机 | 显示全部楼层
lisp的表最基本构造和使用是cons car cdr,但是具有更灵活的使用和操作,法无定法,个人理解了
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 51个

财富等级: 招财进宝

 楼主| 发表于 2013-6-7 19:13:47 | 显示全部楼层
st788796 发表于 2013-6-7 19:02
LZ如果说这个LIST是按特定规则使用估计大家就接受了

这么说可能更不行了,他们认为我妨碍了什么

什么也没妨碍了,我只是个”求交点“的函数,不会影响到”求填充“的函数吗?

我是想把数据结构的思想和概念引进来,让他们知道临时保存变量,随时恢复时候需要怎么做而已。

1、我写的这几个就是普通的函数

你随时想保存数据的时候,比如你的任何中间结果,

你只需: (XD::STACK:PUSH 你的数据1)
只要保证和(XD::STACK:POP) 成对使用,不管你经过多少中间过程,

最后配对的这个(括号配对大家都知道吧)XD:STACK:POP就一定能把这个层级的你保存的临时数据给安全读出来。

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

使用道具 举报

发表于 2013-6-7 19:18:37 | 显示全部楼层
呵呵!  其实还是表好理解些。没必要搞个函数!!

这个"入栈"子函数就是(cons A LST).  “出栈”就是(cdr lst).  有必要搞成子函数么?

学lisp不久。 对算法结构也么了解。 简单的认为 表比“堆栈” 要高级些。   

点评

还得度你一下 表和 数据结构是两个东西, 栈里面 放的是你的那些表数据,当然栈本身是个大表。 关键的地方是 怎么读出你的数据,以后你写具体程序的时候。  详情 回复 发表于 2013-6-7 19:24
一级的时候你这样写行, 你在嵌套一级尼,回到上一级的时候,你上一级的数据完好无损,你试试写写 写出来那东西 和我 基础上就是一个东西了。  详情 回复 发表于 2013-6-7 19:22
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 51个

财富等级: 招财进宝

 楼主| 发表于 2013-6-7 19:18:38 | 显示全部楼层
本帖最后由 Lispboy 于 2013-6-7 19:30 编辑
wowan1314 发表于 2013-6-7 18:52
1、这个东西还是容易把人搞糊涂! 这次我是支持长老来的!呵呵

2、LISPBOY把简单的问题复杂化了。lisp里 ...

你以前说过的那个水管子的数据保存问题,就是用这个来解决的,想想你那个水管子:

PUSH        
           <-------保存这个地方的树根交点什么信息1
     PUSH
             <-------保存这个地方的树根交点什么信息2
         PUSH ;;这个地方是你的树叶子了
         POP
             <-------取得树根交点什么信息2,画圆啥的
     POP
         <-------取得树根交点什么信息1,画圆啥的
POP

上面每层你计算的数据都会安全保存,递归回来的时候安全读出。
这几个函数你想用的时候就去调用,不想的时候就放那不管,影响不到其他东西的。

点评

我的“树”是分叉的。 这个数据结构的笔直的,这是“棍”不是“树”。  详情 回复 发表于 2013-6-7 19:21
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2013-6-7 19:21:52 | 显示全部楼层
Lispboy 发表于 2013-6-7 19:18
你以前说过的那个水管子的数据保存问题,就是用这个来解决的,想想你那个水管子:

PUSH

我的“树”是分叉的。 这个数据结构是笔直的,这是“棍”不是“树”。

点评

我这是给你举的一个枝的例子,告诉你每层的时候你都能临时保存交点等数据,供以后回来的时候用。 具体些你那个程序时候,只要遇到分叉的地方,你就PUSH, 回来的时候就POP。  详情 回复 发表于 2013-6-7 19:29
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 51个

财富等级: 招财进宝

 楼主| 发表于 2013-6-7 19:22:00 | 显示全部楼层
wowan1314 发表于 2013-6-7 19:18
呵呵!  其实还是表好理解些。没必要搞个函数!!

这个"入栈"子函数就是(cons A LST).  “出栈”就是 ...

一级的时候你这样写行, 你在嵌套一级尼,回到上一级的时候,你上一级的数据完好无损,你试试写写

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

使用道具 举报

已领礼包: 51个

财富等级: 招财进宝

 楼主| 发表于 2013-6-7 19:24:52 | 显示全部楼层
wowan1314 发表于 2013-6-7 19:18
呵呵!  其实还是表好理解些。没必要搞个函数!!

这个"入栈"子函数就是(cons A LST).  “出栈”就是 ...

还得度你一下:lol

表和 数据结构是两个东西, 栈里面 放的是你的那些表数据,当然栈本身是个大表。

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

使用道具 举报

发表于 2013-6-7 19:28:42 | 显示全部楼层
1、 (SETQ LST '(1))
     2、(setq lst (cons 2 lst))
         3、(setq lst (cons 3 lst))
         .
         .
         3、(setq lst (cdr lst));;退 3
     2、(setq lst (cdr lst));退2
1、(setq lst (cdr lst));退1

点评

像我的代码里面对一个关联表的处理方式了,你这么写完不就和我一样了吗,你每个程序的时候都要写这些代码吗? 我封装的那个函数,可以需要的时候任意建,不同名字区分而已。你换个地方的时候在用一次LST2写好几  详情 回复 发表于 2013-6-7 19:34
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-24 07:49 , Processed in 0.273356 second(s), 57 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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