C语言之栈的链式储存结构

 1.c语言的栈是指限定只在表尾进行插入和删除操作的线性表。

栈是c语言常见的一种数据结构,是一种特殊的线性表。它按照先进先出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据时从栈顶开始弹出数据。

2.在计算机系统中,栈则是一个具有以上属性的动态内存区域。

程序可以将数据压入栈中,也可以将数据从栈中弹出。

3.栈区

由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。

当程序在调用函数时,第一个进栈的是主函数中后的下一条指令(函数调用语句的下一条可
执行语句)的地址,然后是函数的各个参数,在大多数的C编译器中,参数是由右往左入栈
的,然后是函数中的局部变量。注意静态变量(static变量)是不入栈的。

static变量只能在定义该变量的源文件中使用,而在同一源程序中的其他源文件中不能使用,不像全局变量可以在源程序中的任何源文件中都可以使用。

4.栈的空间大小

只要栈的剩余空间大于申请空间,系统就会为程序提供内存,否则会异常提示栈溢出。栈的内存在计算机中是向低地址扩展的,

栈的最大容量是系统预先规定好的,在Windows下,栈的大小是2M,因此,能从栈获得的空间较小。 

5.使用栈的优点

虽然栈的空间大小较小,但是申请速度快,在程序运行时通过函数的不断的进栈与出栈的过程,使较小的内存得到了充分给利用,提高了程序的运行效率,让程序运行可以占用较小的内存。

下面是链式栈的基本实现

#include<stdio.h>
#include<windows.h>
typedef struct linknode
{
	int data;
	struct linknode *next;
}listack;
void InitStack(listack *&s)//初始化栈
{
	s = (listack*)malloc(sizeof(listack));
	s->next = NULL;
}
void DestoryStack(listack *&s)//销毁栈
{
	listack *p = s, *q = s->next;//定义两个结构体指针分别储存当前指针和下一个指针
	while (q)//全部销毁
	{
		free(p);
		p = q;
		q = p->next;
	}
	free(p);//销毁栈顶
}
void Push(listack *&s, int x)//进栈
{
	listack *p;
	p = (listack *)malloc(sizeof(listack));
	p->data = x;
	p->next = s->next;
	s->next = p;
}
void Pop(listack *&s, int &x)//出栈
{
	listack *p;
	if (s->next == NULL)
		return;
	p = s->next;
	x = p->data;
	s->next = p->next;
	free(p);
}
int main()
{
	int i, x;
	listack *s;
	InitStack(s);
	for (i = 0; i < 10; i++)
	{
		Push(s, i);//进栈,
	}
	for (i = 0; i < 10; i++)
	{
		Pop(s, x);//弹出数据
		printf("%d ", x);
	}
	system("pause");
}

c语言实现栈的这种方式有很多,比如,数组,指针也可以,以上代码是通过链表来实现栈的存储方式。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值