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语言实现栈的这种方式有很多,比如,数组,指针也可以,以上代码是通过链表来实现栈的存储方式。