栈的基本 *** 作

栈的基本 *** 作,第1张

1、栈是一种先进后出的线性表,是最基本的一种数据结构

2、栈是限制插入和删除只能在一个位置上进行的线性表

3、由于栈是线性表,所以可以使用链表或顺序表实现

4、链栈(动态栈):使用单链表实现栈。通过单链表的头插法来实现入栈 *** 作;通过删除首节点来实现出栈 *** 作;动态栈具有链表的部分特性,即元素与元素之间在物理存储上可以不连续,但是功能有些受限制,动态栈只能在栈顶处进行插入和删除 *** 作,不能在栈尾或者栈中进行插入和删除 *** 作

5、顺序栈(静态栈):每个栈都有一个topOfStack,用来表示栈顶在数组中的下标;需要注意的是对空栈的pop *** 作和对满栈的push *** 作都会产生数组越界并引起程序crash

楼主问这样的问题,需要澄清平台。比如windows下的与linux下的编译器及很多嵌入式C编译器不同。为什么考虑嵌入式C?原因是目前C语言的很大市场在嵌入式领域。windows下,除了某些特殊需要,java,C++,C#已经优势尽显了。

另外,讨论了半天,q在你代码的那里?我怎么没找到??我眼睛都揉红了也没找见呀

只好表述一下原理

VC下:

1. 函数形参和函数内部非静态局部变量都在栈上分配(所以a,b,p本身都在栈上。但p指向的内容在堆上。q在哪里,我找不到)。

栈的分配的方法是:sp-=字数。

sp是堆栈指针。”字数“是说:你分配一个字节的局部变量,编译器也给你一个字的长度的空间。原因是,堆栈是具有字长度的。16位、32位机器下,字长度为16,64位机器下,字长度为32.

而且,windows下,栈是从高地址向低地址增长的。为什么?栈与堆共享空间,并且,堆从低向高长,栈从高向低长,降低溢出风险。

静态区名字本身就说明了他的特性:静止的,不随程序的运行变化。也就是相对的说,堆和栈都是动态的。静态区是编译器在编译时指定长度、链接时定位地址、windows载入器载入时分配内存。

这里的动与静是编译器和链接器的说法,是语言层面。不适用于系统层面。Windows随时可能将任何用户程序程序的全部资源“请出”内存,也可重新载入,此时,什么静都是浮云。

还有返回值。楼主的main不返回值编译器会警告你的。返回值存在什么地方?

答案是寄存器里AX(EAX,DX,EDX等)。

嵌入式系统里可能这些都不适用。比如,某些嵌入式处理器的形参直接使用寄存器(R0~R15,或A、B等)


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/11524067.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-16
下一篇 2023-05-16

发表评论

登录后才能评论

评论列表(0条)

保存