链栈的基本操作(初始化,压栈,出栈)

链式栈的基本操作。这个例子中栈顶指针指到栈顶结点,不过在学习栈的时候,发现有一个有趣的问题:
严蔚敏版的<数据结构>中讲的是顺序栈的栈顶指针在栈顶元素的下一个位置。个人理解:由于判栈为空是这样的:top = base; 所以当插入第一个元素时,base指向这个元素,top+1,以后每次添加新的栈顶元素时,top都要加1,这就导致了栈顶指针永远在栈顶元素的下一个位置上。。

#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
//链栈的基本操作 date 2015/03/28
//结点
typedef struct Node{
    int data;
    struct Node * next;
}Node ,*p_Node;

//栈
typedef struct Stack{
    p_Node top;
    p_Node base;
}Stack,* p_Stack;

//出栈
void pop(Stack * s)
{
    if(s->top == s->base)
    {
        return;
    }
    p_Node node = s->top;
    s->top = node->next;
    printf("出栈元素: %d \n",node->data);
    free(node);
}

//初始化栈
void init_Stack(Stack * s)
{
    s->base = (p_Node)malloc(sizeof(Node));
    if(s->base == NULL)
    {
        printf("分配存储空间失败");
        exit(-1);
    }
    s->top = s->base;
    s->top->next = NULL;
    return;
}

//压栈
void push(Stack * s, int data)
{
    p_Node newNode = (p_Node)malloc(sizeof(Node));
    newNode->data = data;
    newNode->next = s->top;
    s->top = newNode;

}

//输出栈的内容
void show_Stack(Stack * s)
{
    p_Node p = s->top;
    while(p != s->base)
    {
        printf("%d",p->data);
        p = p->next;
    } 
}

//判断栈是否为空
int is_empty(Stack * s)
{
    if(s->top == s->base)
    {
        return 1;
    }else{
        return 0;
    }
}

int main(void)
{
    Stack stack;
    p_Stack p = &stack;
    push(p,1);
    push(p,2);
    push(p,4);
    push(p,3);
    pop(p);
    pop(p);
    show_Stack(p);
    return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值