链式栈初始化,入栈,出栈

//链式栈的结构

typedef struct Node //栈的结点结构
{
    int data;
    struct Node *next;
}Node,*PNode;

typedef struct LinkStack //栈的结构
{
    PNode top; //栈顶
    int count; 
}LinkStack;

//栈初始化

bool InitStack(LinkStack *S)
{ 
        S->top = (PNode)malloc(sizeof(Node));
        if(!S->top)  //有无可分配的内存
                return false;
        S->top=NULL;
        S->count=0;
        return true;
}

//入栈

LinkStack* push( LinkStack * stack,int n )
{
    PNode s;
    s=(PNode)malloc(sizeof(Node));
    s->data=n;
    s->next=stack->top;
    stack->top=s;
    stack->count++;

    return stack;
}

//出栈

bool pop( LinkStack *stack,int & n )
{
    if( stack->count==0 )
        return false;
    n=stack->top->data;
    PNode s=stack->top;
    stack->top=s->next;

    free(s);
    stack->count--;
    return true;
}

//完整代码

//栈的链式存储
#include <cstdlib>
#include <cstdio>


typedef struct Node //栈的结点结构
{
    int data;
    struct Node *next;
}Node,*PNode;

typedef struct LinkStack //栈的结构
{
    PNode top; //栈顶
    int count; 
}LinkStack;

bool InitStack(LinkStack *S)
{ 
        S->top = (PNode)malloc(sizeof(Node));
        if(!S->top)  //有无可分配的内存
                return false;
        S->top=NULL;
        S->count=0;
        return true;
}


LinkStack* push( LinkStack * stack,int n )
{
    PNode s;
    s=(PNode)malloc(sizeof(Node));
    s->data=n;
    s->next=stack->top;
    stack->top=s;
    stack->count++;

    return stack;
}
bool pop( LinkStack *stack,int & n )
{
    if( stack->count==0 )
        return false;
    n=stack->top->data;
    PNode s=stack->top;
    stack->top=s->next;

    free(s);
    stack->count--;
    return true;
}



int main()
{
    LinkStack stack; //栈必须初始化
    int i=10;
    if(InitStack(&stack))
        while( i-- )
            push(&stack,i);
    int t=0;
    while( stack.count ){
        if(pop(&stack,t))
            printf( "%d pop\n",t );
    }
    return 0;
}

1、初始化栈的时候必须注意的一点

    LinkStack s2;  //首先定义一个栈的结构变量s2
    printf("%d\n",&s2);
    s2.top=NULL;
    s2.count=0;

上面这种初始化方式,没有问题,LinkStack s2; 已经给s2分配空间,但是没有初始化s2.top,所以只对s2的变量top和count初始化就行。

    LinkStack *s1; //首先定义一个栈的指针变量s1
    s1=NULL;
    s1->top=NULL;//ERROR
    s1->count=0;
一开始,我是用s1的定义方式,一直报错,原因是 只是初始化了一个指针变量,计算机**只是分配了存储地址的内存,但是并没有分配*用来存储指针所指向的数据*的内存**,所以上面的程序,s1->top—=NULL 就会出错
这个问题如同
int *s;
*s=100;//ERROR!

所以在使用指针的时候必须要小心这一点!必须要对指针解除引用运算符(*)或使用指向结构体成员运算符(->)之前,将它初始化为一个确定的适当的地址。
2、链式结构的构成

typedef struct Node //栈的结点结构
{
    int data;
    struct Node *next;
}Node,*PNode;

typedef struct LinkStack //栈的结构
{
    PNode top; //栈顶
    int count; 
}LinkStack;

我的理解,LinkStack 是申请一块内存,里面放 栈的top指针 ( 其中,top是指向栈结点的指针结构) 和 count (对栈中的元素个数进行计数的)。其实,这里,LinkStack的结构可以根据自己的需要进行调整,比如,

typedef struct LinkStack //栈的结构
{
    PNode top;//栈顶
    PNode bottom; //栈底
    int count; 
}LinkStack;

而这块内存一但初始化之后,就一直是它,进栈 出栈等操作只是针对里面的top和count发生变化,对他的地址,他的大小都没有影响,从下面可以看出:

    LinkStack s2; 
    printf("%d\n",&s2);
    s2.top=NULL;
    s2.count=0;
    push(&s2,3);
    printf("%d\n",&s2);
    push(&s2,4);
    printf("%d\n",&s2);
    int t1=0;pop(&s2,t1);
    printf("%d\n",&s2);

输出

3602216
3602216
3602216
3602216
  • 19
    点赞
  • 67
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值