栈的概念与相关操作
来源:互联网 发布:unity3d粒子系统 编辑:程序博客网 时间:2024/06/06 05:09
1、堆和栈的区别
内存分为静态内寸和动态内存,静态内存是在栈中分配的,动态内存是在堆中分配的。如:int i = 1;变量i是在栈中分配的;(int * p) = (int *) malloc(8*sizeof(int));变量p所指向的内存空间是在堆中分配的,而变量p本身还是在栈中分配。在栈里面分配的是由操作系统分配的,在堆里面分配的是由程序员手动建立起来的需要程序员手动释放或者由程序运行结束后操作系统释放。
栈和堆是数据分配的的一种方式,静态的或局部变量它们是以压栈和出栈的方式分配内存的(栈区),动态的内存它是以一种堆排序的方式分配的内存(堆区)。
堆是动态分配内存的,并且你可以分配使用很大的内存。但是不注意会产生内存泄漏。并且频繁地malloc和free会产生内存碎片(相当于磁盘碎片),因为c分配动态内存时需要寻找匹配的内存。而用栈则不会产生碎片。 在栈上存取数据比通过指针在堆上存取数据快些。
平时大家说的堆栈和栈是一样的,就是栈(stack),而说堆时才是堆heap. 栈是先入后出的,一般是由高地址向低地址生长。
2、栈的概念
栈是操作受限的线性表,仅在表尾进行插入和删除等操作(后进先出)。
3、栈的相关操作
栈的表示和实现、压栈、出栈、栈的判空。
常见栈的应用:
函数调用
函数调用时会在栈上有一系列的保留现场及传递参数的操作。 栈的空间大小有限定,vc的缺省是2M。栈不够用的情况一般是程序中分配了大量数组和递归函数层次太深。当一个函数调用完返回后它会释放该函数中所有的栈空间。栈占用的内存由编译器自动管理不用程序员管理释放。
中断
表达式求值
内存分配
缓冲处理
走迷宫(http://www.cppblog.com/zhenglinbo/archive/2012/02/28/166661.html)
4、相关操作如下
#include<stdio.h>#include <malloc.h>#include <stdlib.h>typedef struct Node{int data;struct Node *pNext;}NODE, *pNode;typedef struct Stack{pNode pTop;pNode pBottom;}Stack, * pStack;void init_stack(pStack);//将栈进行初始化void push_stack(pStack pS,int val);//把val的值放入栈中,执行压栈操作void traverse_stack(pStack pS);//将栈中的数值进行输出,遍历栈bool pop_stack(pStack pS,int * val);//对栈执行出栈操作将出栈的值放入val中bool empty_stack(pStack pS);//判断栈是否为空void clear_stack(pStack pS);//将栈清空即将栈变为空栈int main(void){int val;Stack s1;init_stack(&s1);push_stack(&s1, 1);push_stack(&s1, 10);push_stack(&s1, 13);traverse_stack(&s1);pop_stack(&s1,&val);printf("出栈的元素是%d\n",val);traverse_stack(&s1);clear_stack(&s1);traverse_stack(&s1);return 0;}void init_stack(pStack pS){pS->pTop = (pNode) malloc(sizeof(NODE));if(pS == NULL){printf("动态内存分配失败\n");exit(-1);}else{pS->pBottom = pS->pTop;pS->pBottom->pNext = NULL;}}void push_stack(pStack pS, int val){pNode pNew = (pNode)malloc(sizeof(NODE));if(pNew == NULL){printf("动态内存分配失败\n");exit(-1);}pNew->data = val;pNew->pNext = pS->pTop;pS->pTop = pNew;return;}void traverse_stack(pStack pS){pNode p = pS->pTop;while(p != pS->pBottom){printf("%d ",p->data);p = p->pNext;}printf("\n");return;}bool empty_stack(pStack pS){if(pS->pTop == pS->pBottom)return true;elsereturn false;}bool pop_stack(pStack pS,int * val){if(empty_stack(pS))return false;pNode p = pS->pTop;*val = pS->pTop->data;pS->pTop = p->pNext;free(p);p = NULL;return true;}void clear_stack(pStack pS){if(empty_stack(pS))return;pNode p = pS->pTop;pNode q = NULL;while(p != pS->pBottom){q = p->pNext;free(p);p = q;}pS->pTop = pS->pBottom;return;}
运行结果如下:
13 10 1
出栈的元素是13
10 1
请按任意键继续. . .
- 栈的概念与相关操作
- LINUX中时间相关的概念与操作
- Git相关概念及操作以及与SVN的区别
- 与OGRE相关的概念
- 与OGRE相关的概念
- 与时间相关的概念
- 栈的概念与基本操作
- swap相关的概念和操作
- 字符与编码相关概念的介绍
- Oracle 与SQL相关的几个概念
- linux下与中断相关的概念
- 与面向对象相关的概念
- C#与C++相关概念的比较
- 多线程的概念与相关方法
- 虚拟地址与物理地址的相关概念
- 计算机端口与socket的相关概念
- 多线程与多进程的相关概念
- LDAP的相关概念与objectClass介绍
- PLSQL基础知识点总结 (1)
- streamwriter
- JavaScript 函数
- 教育部:珍惜幼儿童年生活严禁超前教育-教育部-幼儿-超前教育
- cocos2d-for-iPhone 【开发环境搭建】
- 栈的概念与相关操作
- 义乌一院校专门培养“网络小贩”90后年入百万
- 过滤特定字符
- Linux源码中的mktime算法解析
- 如何在SQL Server 2005中为安装程序增加计数器注册表项值
- dom4j解析xml
- 安装ORACLE的几点建议
- Windows消息机制2
- 技巧:快速提高 Vi/Vim 使用效率的原则与途径