栈的概念与相关操作

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;
	else
		return 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

请按任意键继续. . .


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值