您的位置:首页 > 其它

我对栈的学习

2015-09-15 12:31 295 查看
这里我们说的是数据结构中的栈,是一种先进后出的一种数据管理方式,打个比方就是我们把衣服整理好叠进柜子,最先折的衣服都放在最下面,等我们要穿的时候就会拿起最上面的那个衣服穿。

我还是用代码来说明吧,用C语言实现 链表的出栈入栈。代码就是基于我上一篇队列的代码修改的,进过这个修改我更加明白了要想操作好这个数据结构,最重要的是理解,我们是对地址进行操作。

1.结构体定义

typedef struct link
{
    int data;
    struct link *next;
}node;

typedef struct Stack
{
    node *bottom,*top;//这两个结构体指针就跟队列的队首和队尾指针一样,就2个下标,来操作数据
}stack;
这里需要注意的是bottom是栈底,top是栈顶,数据都是先放栈底,出去是栈顶的数据出去。



2.创建链表和栈
stack *creat_stack()
{
    stack *q=(stack *)malloc(sizeof(stack));

    q->bottom=NULL;
    q->top=NULL;
    return q;
}

node * creat_link(int n)
{
    node *new,*pre,*head;
    int i=0;
    new=NULL;
    head=(node *)malloc(sizeof(node));
    head->next=NULL;
    pre=head;
    for(;i<n;i++)
    {
    
        new=(node*)malloc(sizeof(node));
        printf("input the data\n");
        scanf("%d",&new->data);
        pre->next=new;
        pre=new;

    }
    pre->next=NULL;
    return head;
}
3.入栈
void insert_link_to_stack(stack*q,node * head)
{

    node *newp;
    newp=head->next;
    while(newp)
    {
        if(q->bottom==NULL)
        {
            q->bottom=q->top=newp;
        }
        else
        {
            q->top->next=newp;
            q->top=newp;
        }
        newp=newp->next;
    }

}


入栈主要是移动top这个指针,跟队列的rear指针一样

4.出栈
void delete_stack(stack * q)
{
    node *pnode=NULL;
    
    if(q->bottom==NULL)
    {
        printf("\empty stack");
    }
    else
    {
        pnode=q->bottom;
        if(q->bottom==q->top)
        {
            q->bottom=q->top=NULL;

        }
        else{
            while(pnode->next!=q->top)
            {
                pnode=pnode->next;
            }
            q->top=pnode;
            q->top->next=NULL;
        }
    }
}

出栈也是移动top这个指针,首先我们是遍历到top,然后再把top前面的一个结点赋值给top,最后free 掉原来的top即可

5.获得栈的长度
int getlength(stack *q)
{
    int nlen=0;
    node *pnode=q->bottom;
    if(pnode==NULL)
    {
        nlen=0;
    }
    while(pnode!=NULL)
    {
        pnode=pnode->next;
        nlen++;
    }

    return nlen;
}
6.打印栈的数据
void print_stack(stack * q)
{
    node * pnode=q->bottom;
    if(pnode==NULL)
    {
        printf("empty stack!\n");
        return ;
    }
    printf("data:");
    while(pnode!=NULL)
    {
        printf("%d ",pnode->data);
        pnode=pnode->next;
    }
   // printf("%d",pnode->data);
}


主函数
void main()
{
    int nlen=0;
    int i=0;
    node * head;
    printf("input the number of the data\n");
    scanf("%d",&i);
    head=creat_link(i);
    stack *hp=creat_stack();
    insert_link_to_stack(hp,head);
    nlen=getlength(hp);
    printf("nlen=%d\n",nlen);
    print_stack(hp);
    delete_stack(hp);
    delete_stack(hp);
    nlen=getlength(hp);
    printf("\nneln=%d\n",nlen);
    print_stack(hp);
    printf("\n");
}
代码运行效果如下,可以看出,入栈是4 2 1 出了2次栈后,4还在,说明是先入后出

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: