c语言链栈,链栈 C语言实现

本文介绍了栈这种数据结构,特别是它的后进先出(LIFO)特性,并对比了顺序栈和链栈。顺序栈依赖预分配的数组,而链栈通过动态内存分配解决了空间限制的问题。文中给出了链栈的C语言实现,包括初始化、入栈、出栈和获取栈顶元素的操作,并演示了一个完整的压栈和出栈的示例。
摘要由CSDN通过智能技术生成

http://www.cnblogs.com/longyi1234/archive/2010/03/28/1698803.html

2010.03

栈(Stack)是限定只能在表的一端进行插入和删除操作的线性表。在表中,允许插入和删除的一端称作“栈顶(top)”,不允许插入和删除的另一端称作“栈底(bottom)”。

01.gif

通常称往栈顶插入元素的操作为“入栈”,称删除栈顶元素的操作为“出栈”。因为后入栈的元素先于先入栈的元素出栈,故被称为是一种“后进先出”的结构,因此又称 LIFO 表(Last In First Out的缩写)。

和线性表类似,栈也有两种存储表示:顺序栈和链栈。

顺序存储结构简称为顺序栈。和顺序表类似,对顺序栈也需要事先为它分配一个可以容纳最多元素的存储空间。用图表示顺序栈如下:

02.gif

链栈即为栈的链式存储结构。

03.gif

顺序栈的实现依靠数组,而数组需要事先声明长度,一次性地静态地分配内存空间。这样就给我们带来很多不便。因为我们事先并不能精确地估计栈所需的大小,估计大了浪费空间,估计小了后果就严重了,导致程序无法正常运行。所以我们通常使用链栈这种数据结构。

链栈用链表作为存储结构,栈初始化时仅需给栈顶指针分配内存空间,而后每当有数据入栈时再为该数据分配空间,这样实现了内存空间的动态分配。理论上栈的大小可以是无限大的(小心撑爆你的内存 o(∩_∩)o)。不存在顺序栈的诸多问题。

程序实现:依次把0~99压栈,再依次出栈并打印。

程序清单:LinkStack.h                 LinkStackTest.c

LinkStack.h

70692823_1.gif/*LinkStack.h*/70692823_2.gif#include70692823_2.gif

70692823_2.gif#defineTRUE 170692823_2.gif#defineFALSE 070692823_2.gif#defineNULL 070692823_2.gif

70692823_2.giftypedefintElementType;

70692823_1.giftypedefstructnode{

70692823_3.gifElementType data;

70692823_3.gifstructnode*next;

70692823_4.gif}StackNode,*LinkStack;

70692823_2.gif

70692823_1.gifvoidInitStack(LinkStack top){

70692823_3.giftop->next=NULL;

70692823_4.gif}70692823_2.gif

70692823_1.gifintIsEmpty(LinkStack top){

70692823_3.gifif(top->next==NULL)returnTRUE;

70692823_3.gif    return FALSE;intPush(LinkStack top, ElementType element){

70692823_3.gifStackNode*temp;

70692823_3.giftemp=(StackNode*)malloc(sizeof(StackNode));

70692823_3.gifif(temp==NULL)returnFALSE;

70692823_3.giftemp->data=element;

70692823_3.giftemp->next=top->next;

70692823_3.giftop->next=temp;

70692823_3.gifreturnTRUE;

70692823_4.gif}70692823_2.gif

70692823_1.gifintPop(LinkStack top, ElementType*element){

70692823_3.gifif(IsEmpty(top))returnFALSE;

70692823_3.gifStackNode*temp=top->next;

70692823_3.gif*element=temp->data;

70692823_3.giftop->next=temp->next;

70692823_3.giffree(temp);

70692823_3.gif    return TRUE;voidGetTop(LinkStack top, ElementType*element){

70692823_3.gif*element=top->next->data;

70692823_4.gif}

LinkStackTest.c

70692823_1.gif/*LinkStackTest.c*/70692823_2.gif#include70692823_2.gif#include"LinkStack.h"70692823_2.gif

70692823_1.gifvoidmain(){

70692823_3.gifLinkStack s;

70692823_3.gifs=(LinkStack)malloc(sizeof(StackNode));

70692823_3.gifInitStack(s);

70692823_3.giffor(inti=0; i<100; i++)

70692823_3.gifPush(s,i);

70692823_3.gifintrslt;

70692823_5.gifwhile(!IsEmpty(s)){

70692823_3.gifPop(s,&rslt);

70692823_3.gifprintf("%d",rslt);

70692823_6.gif}

70692823_4.gif}

70692823_4.gif}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值