重学数据结构003——栈的基本操作及实现(链式存储)

1.栈的概念

    展示只允许在其一端进行插入语删除操作的表。从定义上来说,栈其实也是线性表,因此栈也具备大多数线性表所具备的基本操作。但是,从定义上可知,栈在进行插入、删除操作时,只能在一端进行操作,这一端成为栈顶(top)。

    栈最核心的操作主要是:进栈(Push)、出栈(Pop)、返回栈顶元素(Top)。 此外,栈还判断栈是否为空、创见栈、清空栈等操作。

    既然是线性表,那么栈从实现方式来说主要有两种:顺序存储实现(数组)、链式存储实现(链表)。下面是链式存储实现方式下,站的数据结构定义:

typedef struct Node *PtrToNode; 
typedef PtrToNode Stack; 
typedef struct Node 
{ 
    int Element; 
    PtrToNode Next; 
};

    栈的基本操作:

//判断栈是否为空 
int IsEmpty(Stack S); 
//创见栈 
Stack CreateStack(); 
//销毁栈 
void DisposeStack(Stack S); 
//清空栈 
void MakeEmpty(Stack S); 
//进栈 
void Push(int X,Stack S); 
//返回栈顶元素 
int Top(Stack S); 
//出栈 
void Pop(Stack S); 

    下面是一个完整的关于栈的基本操作的例子: 

#include <stdio.h> 
#include <stdlib.h> 
 
typedef struct Node *PtrToNode; 
typedef PtrToNode Stack; 
typedef struct Node 
{ 
    int Element; 
    PtrToNode Next; 
}; 
 
int IsEmpty(Stack S); 
Stack CreateStack(); 
void DisposeStack(Stack S); 
void MakeEmpty(Stack S); 
void Push(int X,Stack S); 
int Top(Stack S); 
void Pop(Stack S); 
 
//判断栈是否为空 
int IsEmpty(Stack S) 
{ 
    return S->Next == NULL; 
} 
//创建链栈 
Stack CreateStack() 
{ 
    Stack S = malloc(sizeof(struct Node)); 
    if(S == NULL) 
    { 
        printf("No enough memory!"); 
        return NULL; 
    } 
    S->Next = NULL; 
    MakeEmpty(S); 
    return S; 
} 
 
void MakeEmpty(Stack S) 
{ 
    if(S == NULL) 
    { 
        printf("Use CreateStack First!"); 
    } 
    else 
    { 
        while(!IsEmpty(S)) 
        { 
            Pop(S); 
        } 
    } 
} 
 
void Push(int X,Stack S) 
{ 
    PtrToNode Tmp; 
    Tmp = malloc(sizeof(struct Node)); 
    if(Tmp != NULL) 
    { 
        Tmp->Element = X; 
        Tmp->Next = S->Next; 
        S->Next = Tmp; 
    } 
    else 
    { 
        printf("Out of space!"); 
    } 
} 
 
void Pop(Stack S) 
{ 
     
    if(IsEmpty(S)) 
    { 
        printf("The Stack is Empty!"); 
    } 
    else 
    { 
        PtrToNode Tmp = S->Next; 
        S->Next = Tmp->Next; 
        free(Tmp); 
    } 
} 
 
int Top(Stack S) 
{ 
    if(IsEmpty(S)) 
    { 
        printf("The stack is empty!"); 
        return 0; 
    } 
    else 
    { 
        return S->Next->Element; 
    } 
} 
 
int main(void) 
{ 
    Stack S = CreateStack(); 
    int i; 
    for(i = 0; i < 5; i++) 
    { 
        Push(i,S); 
    } 
 
    while(!IsEmpty(S)) 
    { 
        printf("%d\n",Top(S)); 
        Pop(S); 
    } 
    return 0; 
} 
 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值