数据结构与算法分析-栈

数据结构与算法分析-栈(单链表实现)

栈的单链表实现很简单,甚至比单链表本身还简单,因为栈的进栈和出栈都是在表头完成的,具体的就不分析了。
代码见github:https://github.com/xiabodan/DataStructure 保持持续更新,或者直接

git clone https://github.com/xiabodan/DataStructure.git

//by xiabodan
#include <stdio.h>
#include <stdlib.h>

typedef int elementtype;

typedef struct node *stack;
typedef struct node *position;
struct node {
    elementtype data;
    position next;
};

int isempty(stack S);
void delete_stack(stack S);
stack create_stack(void);
elementtype top(stack S);
elementtype pop(stack S);
void push(stack S,elementtype data);



int isempty(stack S)
{
    return (S->next == NULL);
}
stack create_stack(void)
{
    stack S;
    S = (position)malloc(sizeof(struct node));
    if( S == NULL)
    {   
        printf("create_stack : out of space");
        return ;
    }
    S->next = NULL; // S->next is top of stack ,because header can't store element
    return  S;
}
void delete_stack(stack S)
{
     if(S == NULL)
        printf("S is a empty stack!\n");
     else 
     {
        while( !isempty( S))
            pop(S);
     }
}

elementtype pop(stack S)
{
    elementtype data;
    if(!isempty(S))
    {
        position tem;
        tem = S->next;//tem  point to the top node
        data = S->next->data;
        S->next = tem->next;//also S->next = S->next->next
        free(tem);
        return data;
    }
    else 
        printf("pop : empty stack!\n");
    return 0;
}

elementtype top(stack S)
{
    if(!isempty(S))
        return (S->next->data);
    printf("top : empty stack!\n");
    return 0;
}

void push(stack S,elementtype data)
{
    position P;
    P = (position)malloc(sizeof(struct node));
    if( P == NULL)
    {   
        printf("push : out of space");
        return ;
    }
    P->data = data;    
    P->next = S->next;  //compare list , insert node location the first node here,but insert node anywhere in list
    S->next = P;
}


int main(int argc ,char** argv)
{
    stack S;
    int i = 0 ;
    elementtype data;
    S = create_stack();
    printf("push 10 datas from 0 to 9 \n");
    for(i=0;i<10;i++)
    {
        push(S,i);
    }
    printf("S is empty? %d \n",isempty( S));

    printf("pop 5 datas \n");
    for(i=0;i<5;i++)
    {
        data = pop(S);
        printf("pop data is : %d\n",data);
    }
    printf("push 2 datas 11,12\n");
    push(S,11);
    push(S,12);
    printf("pop all remain datas \n");
    while(!isempty( S))
    {
        data = pop(S);
        printf("pop data is : %d\n",data);
    }
    printf("S is empty? %d \n",isempty( S));
    delete_stack(S);

}

结果

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值