“栈”是一种后进先出(LIFO,或叫先进后出FILO)的数据结构。这是数据结构的范畴。
您所说的栈,是由 *** 作系统负责管理的一段栈空间,在递归、子程序调用等处应用广泛。这是 *** 作系统的范畴。
——并不是在C语言范畴讨论的概念。
堆栈都是一种数据项按序排列的数据结构,只能在一端(称为栈顶(top))对数据项进行插入和删除。要点:堆:顺序随意栈:后进先出(Last-In/First-Out)
一、预备知识—程序的内存分配 一个由C/C++编译的程序占用的内存分为以下几个部分 1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其 *** 作方式类似于数据结构中的栈。 2、堆区(heap)— 由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表。 3、全局区(静态区)(static)— 全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。程序结束后由系统释放。 4、文字常量区 — 常量字符串就是放在这里的,程序结束后由系统释放 。 5、程序代码区 — 存放函数体的二进制代码。 二、例子程序 这是一个前辈写的,非常详细 //maincpp int a = 0; 全局初始化区 char p1; 全局未初始化区 main() { int b; 栈 char s[] = "abc"; 栈 char p2; 栈 char p3 = "123456"; 123456\0在常量区,p3在栈上。 static int c =0; 全局(静态)初始化区 p1 = (char )malloc(10); p2 = (char )malloc(20); } 分配得来得10和20字节的区域就在堆区。 strcpy(p1, "123456"); 123456\0放在常量区,编译器可能会将它与p3所指向的"123456"优化成一个地方。
堆栈就是先入后出的数据结构。
如果用c语言来实现的话用个struct
先定义一个栈的节点
struct
node;
typedef
strcut
node
position;
typedef
position
stack;
stack
creat();
void
push(int,stack);
int
pop(stack);
int
top();
struct
node
{
int
element;
position
next;
}
stack
creat()
{
stack
s;
s=malloc(sizeof(struct
node));
s->next==NULL;
}
void
push(int
a,stack
s)
{
position
temp;
temp=malloc(sizeof(struct
node));
temp->element=a;
temp->next=s->next;:
s->next=temp;
}
int
pop(stack
s)
{
int
res=s->next->element;
position
temp=s->next;
s->next=temp->next;
free
temp;
}
int
top(stack
s)
{
return
s->next->element;
}
好啦,先creat()一个栈,再进行push
pop等。程序中忽略了麻烦的错误检测给出了重点,当然还可以添加其他 *** 作。。对了,头文件也要加上。本人还是习惯用c++弄成一个类^_^
存储数据,指令地址等
栈: 在函数调用时,第一个进栈的是主函数中函数调用后的下一条指令(函数调用语句的下一条可执行语句)的地址,然后是函数的各个参数,在大多数的C编译器中,参数是由右往左入栈的,然后是函数中的局部变量。注意静态变量是不入栈的。
当本次函数调用结束后,局部变量先出栈,然后是参数,最后栈顶指针指向最开始存的地址,也就是主函数中的下一条指令,程序由该点继续运行。
堆:一般是在堆的头部用一个字节存放堆的大小。堆中的具体内容有程序员安排。
全文见百科
>
栈与系统栈
从计算机科学的角度来看,栈指的是一种数据结构,是一种先进后出的数据表。栈的最常见 *** 作有两种:压栈(PUSH)、d栈(POP);用于标识栈的属性也有两个:栈顶(TOP)、栈底(BASE)
PUSH:为栈增加一个元素的 *** 作叫做PUSH,相当于在这摞扑克牌的最上面再放上一张。
POP:从栈中取出一个元素的 *** 作叫做POP,相当于从这摞扑克牌取出最上面的一张。
TOP:标识栈顶位置,并且是动态变化的。每做一次PUSH *** 作,它都会自增1;相反,每做一次POP *** 作,它会自减1。栈顶元素相当于扑克牌最上面一张,只有这张牌的花色是当前可以看到的。
BASE:标识栈底位置,它记录着扑克牌最下面一张的位置。BASE用于防止栈空后继续d栈(牌发完时就不能再去揭牌了)。很明显,一般情况下,BASE是不会变动的。
内存的栈区实际上指的就是系统栈。系统栈由系统自动维护,它用于实现高级语言中函数的调用。对于类似C语言这样的高级语言,系统栈的PUSH、POP等堆栈平衡细节是透明的。一般说来,只有在使用汇编语言开发程序的时候,才需要和它直接打交道。
注意:系统栈在其他文献中可能曾被叫做运行栈、调用栈等。如果不加特别说明,本书中所述及的栈都是指系统栈这个概念。考试大请您注意将其与编写非递归函数求解“八皇后”问题时,在自己程序中所实现的数据结构区分开来。
栈和堆的区别
堆栈空间分配
栈( *** 作系统):由 *** 作系统自动分配释放,存放函数的变量值,局部变量的值等等,其 *** 作方式类似于数据结构中的栈;
堆( *** 作系统):一般由开发者分配释放,若不释放,程序结束时可能会有OS回收,分配方式倒是类似于链表;
堆栈的缓存方式
栈使用的是一级缓存,通常是被调用时处于储存空间,调用完后自动释放;
堆使用的是二级缓存,生命周期有虚拟机的垃圾回收算法来决定(并不一定成为孤儿对象就被立即释放)。所以调用这些对象的速度相对来得慢一些;
堆栈数据结构的区别
堆(数据结构):堆可以看做是一棵树;例如:堆排序;
栈(数据结构):一种先进后出的数据结构;
区别介绍
栈负责保存我们的代码执行(或调用)路,而堆则负责保存对象(或者说数据)的路径。
可以将栈想象成一堆从顶向下堆叠的盒子。当每调用一次方法时,我们将应用程序中所要发生的事情记录在栈顶的一个盒子中,而我们每次只能够使用栈顶的那个盒子。当我们栈顶的盒子被使用完之后,或者说方法执行完毕之后,我们将抛开这个盒子然后继续使用栈顶上的新盒子。堆的工作原理比较相似,但大多数时候堆用作保存信息而非保存执行路径,因此堆能够在任意时间被访问。与栈相比堆没有任何访问限制,堆就像床上的旧衣服,我们并没有花时间去整理,那是因为可以随时找到一件我们需要的衣服,而栈就像储物柜里堆叠的鞋盒,我们只能从最顶层的盒子开始取,直到发现那只合适的。
以上并不是内存中真实的表现形式,但能够帮助我们区分栈和堆。
栈是自行维护的,也就是说内存自动维护栈,当栈顶的盒子不再被使用,它将被抛出。相反的,堆需要考虑垃圾回收,垃圾回收用于保持堆的整洁性,没有人愿意看到周围都是赃衣服,那简直太臭了!
当我们的代码执行的时候,栈和堆中主要放置了四种类型的数据:值类型(Value Type),引用类型(Reference Type),指针(Pointer),指令(Instruction)。
1值类型
bool,byte ,char,decimal,double,enum,float,int,long,sbyte,short,struct,uint,ulong,ushort
2引用类型
class,interface,delegate ,object ,string
3指针
在内存管理方案中放置的第三种类型是类型引用,引用通常就是一个指针。我们不会显示的使用指针,它们由公共语言运行时(CLR)来管理。指针(或引用)是不同于引用类型的,是因为当我们说某个事物是一个引用类型时就意味着我们是通过指针来访问它的。指针是一块内存空间,而它指向另一个内存空间。就像栈和堆一样,指针也同样要占用内存空间,但它的值是一个内存地址或者为空。
以上就是关于C语言栈是什么,栈在哪,需要定义吗全部的内容,包括:C语言栈是什么,栈在哪,需要定义吗、PLC编程中“堆栈”是什么意思、那位大神能讲下C语言中栈的使用啊等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)