想学好数据结构中的堆栈 散尽家财,该怎么处理

想学好数据结构中的堆栈 散尽家财说方法说实例都有分分数最多的是文字说明资料(这方面好的教材我还没有我

想学好数据结构中的堆栈 散尽家财
说方法   说实例   都有分  

分数最多的是文字说明资料   (这方面好的教材我还没有我的那本教材写的很烂)

晚上或者明早上揭帖  

^_^

[解决办法]
四个字:后进先出
[解决办法]
注意溢出
[解决办法]
堆栈,说到底都是在内存中的

就知道这么多
[解决办法]
实战永远是最重要的。多写东西吧!
[解决办法]
其实书中的知识是很可取的,后进先出,这四个非常重要
[解决办法]
一个插入、删除操作是固定在一端进行的数组吧,先进后出
[解决办法]
给个学习的网址
http://blog.vckbase.com/knight/archive/2006/01/18/17109.html
[解决办法]
*****堆栈*****

*******栈???
栈是一种特殊的线性表,是一种只允许在表的一端进行插入或删除操作的线性表。表中允许进行插入、删除操作的一端称为栈顶。表的另一端称为栈底。栈顶的当前位置是动态的,对栈顶当前位置的标记称为栈顶指针。当栈中没有数据元素时,称之为空栈。栈的插入操作通常称为进栈或入栈,栈的删除操作通常称为退栈或出栈。
在生活中常见到这样的例子:假设餐厅里有一叠盘子,如果要从中拿取盘子,只能从最上面一个开始拿,当要再放上一个盘子时也只能放在最上面。栈的结构正是如此。根据栈的定义,每次进栈的数据元素都放在原当前栈顶元素之前而成为新的栈顶元素,每次退栈的数据元素都是原当前栈顶元素。这样,最后进入栈的数据元素总是最先退出栈,因此,栈具有“后进先出”(LIFO:First In Last Out)的特性。
在用高级语言编写程序时,经常写出各种类型的表达式:算术表达式、关系表达式和逻辑表达式等等。编译系统在处理表达式时,需要将表达式翻译成机器指令序列,这首先需要确定运算次序。为此,需要建立两个栈——操作数栈(ODS)和操作符栈(OPS),然后自左至右扫描表达式。为叙述简洁,仅讨论算术表达式的计算,且假设表达式中只含有加、减、乘、除四种运算符和左、右圆括号,一个表达式用“#”作为分界符标识表达式的结束,并将表达式中自左至右所读到的一个操作数或一个操作符称为“一个词”。用栈实现表达式求值的处理过程如下:
(1) 读入一个词;
(2) 判断该词是操作数还是操作符,如果是操作数,则将该操作数压入ODS栈并转第(1)步;否则继续往下;
(3) 判断表达式是否结束,是结束符则转第(7)步,否则继续往下;
(4) 判断当前操作符优先级是否大于或等于OPS栈顶操作符的优先级(左括号的优先级最高,其次是乘除,再是加减,右括号的优先级最低)或者OPS栈是否为空,如果是,当前操作符压入OPS栈并转第(1)步;否则,继续往下;
(5) 从ODS栈中弹出两个操作数Y和X,从OPS栈中弹出一个操作符θ,进行运算XθY,并将结果压入ODS栈。需要说明的是,如果当前操作符是右括号,则重复第(5)步这一过程,直到OPS栈顶操作符为左括号;
(6) 当前操作符压入OPS栈(如果当前操作符是右括号,则它不但不压入OPS栈中,相反还从OPS栈中弹出左括号,这称为去括号)后,转第(1)步;
(7) 判断OPS栈是否为空,不是,则从ODS栈中弹出两个操作数Y和X,从OPS栈中弹出一个操作符θ,进行运算XθY,并将结果压入ODS栈;
(8) ODS栈顶的值即为所求表达式的值,求值过程结束。

long ff(int n)
{
long f;
if(n <0) printf( "n <0,input error ");
else if(n==0||n==1) f=1;
else f=ff(n-1)*n;
return(f);
}
main()
{
int n;
long y;
printf( "\ninput a inteager number:\n ");
scanf( "%d ",&n);
y=ff(n);
printf( "%d!=%ld ",n,y);
}
这是一个函数的递归调用,主函数调用ff 后即进入函数ff执行,如果n <0,n==0或n=1时都将结束函数的执行,否则就递归调用ff函数自身。由于每次递归调用的实参为n-1,即把n-1的值赋予形参n,最后当n-1的值为1时再作递归调用,形参n的值也为1,将使递归终止。然后可逐层退回。
下面我们再举例说明该过程。设执行本程序时输入为5,即求5!。在主函数中的调用语句即为y=ff(5),进入ff函数后,由于n=5,不等于0或1,故应执行f=ff(n-1)*n,即f=ff(5-1)*5。该语句对ff作递归调用即ff(4)
所以有ff(5)==ff(4)*5==ff(3)*4*5==ff(2)*3*4*5==ff(1)*2*3*4*5==1*2*3*4*5
可以看出要计算ff(5)的值首先知道ff(4)的值,依次类推,即先将ff(5)放入到一个栈中,称进栈,随着函数进一步的递归调用,ff(4)接着进栈,直到ff(1)确定值,函数的递归调用完毕,但是我们知道ff(5)的值需要反推回去才能够输出,然后依次出栈.

********堆栈???
堆栈是一个在计算机科学中经常使用的抽象数据类型。堆栈中的物体具有一个特性: 最后一个放入堆栈中的物体总是被最先拿出来,这个特性通常称为后进先处(LIFO)队列. 堆栈中定义了一些操作. 两个最重要的是PUSH和POP。 PUSH操作在堆栈的顶部加入一个元素。POP操作相反, 在堆栈顶部移去一个元素, 并将堆栈的大小减一。

当堆栈指针指向最后压入堆栈的数据时,称为满堆栈(Full Stack),而当堆栈指针指向下一个将要放入数据的空位置时,称为空堆栈(Empty Stack)。

同时,根据堆栈的生成方式,又可以分为递增堆栈(Ascending Stack)和递减堆栈(DecendingStack),当堆栈由低地址向高地址生成时,称为递增堆栈,当堆栈由高地址向低地址生成时,称为递减堆栈。
[解决办法]



http://210.40.7.188/E%27ojc/C/C_04/000.htm
[解决办法]
想看清楚栈的工作过程,推荐你学一下汇编级别的调试,用olldbg调试看看,olldbg的使用可以去看雪论坛下。这个软件的堆栈窗口可以显示当前的堆栈使用情况,而且还能自动识别函数参数,返回地址,SEH句柄等等,功能强大


[解决办法]
弄明白堆栈容易啊,用堆栈本身不难,就是那些问题可能会复杂。