链栈 C语言实现

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

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

程序实现:依次把0~99压栈,再依次出栈并打印。
程序清单:LinkStack.h                 LinkStackTest.c

LinkStack.h 

/* LinkStack.h */
#include 
< stdlib.h >

#define  TRUE 1
#define  FALSE 0
#define  NULL 0

typedef 
int  ElementType;
typedef 
struct  node  {
    ElementType data;
    
struct node *next;
}
StackNode,  * LinkStack;

void  InitStack(LinkStack top)  {
    top
->next = NULL;
}


int  IsEmpty(LinkStack top)  {
    
if(top->next == NULL) return TRUE;
    
return FALSE;
}


int  Push(LinkStack top, ElementType element)  {
    StackNode 
*temp;
    temp 
= (StackNode *)malloc(sizeof(StackNode));
    
if(temp == NULL) return FALSE;
    temp
->data = element;
    temp
->next = top->next;
    top
->next = temp;
    
return TRUE;
}


int  Pop(LinkStack top, ElementType  * element)  {
    
if(IsEmpty(top)) return FALSE;
    StackNode 
*temp = top->next;
    
*element = temp->data;
    top
->next = temp->next;
    free(temp);
    
return TRUE;
}


void  GetTop(LinkStack top, ElementType  * element)  {
    
*element = top->next->data;
}

 

LinkStackTest.c

/* LinkStackTest.c */
#include 
< stdio.h >
#include 
" LinkStack.h "

void  main()  {
    LinkStack s;
    s 
= (LinkStack)malloc(sizeof(StackNode));
    InitStack(s);
    
for(int i=0; i<100; i++)
        Push(s,i);
    
int rslt;
    
while (!IsEmpty(s)) {
        Pop(s,
&rslt);
        printf(
"%d ",rslt);
    }

}
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值