算法与数据结构(c语言)——链栈存储结构及实现

链栈:就是一种特殊的单链表,FILO(先进后出)

通常对于链栈来说:

1.是不需要头节点的。

2.基本不存在满栈的情况,除非内存已没有可用的空间。

 

不多bibi你们都懂哈,直接上代码: 

链栈结构:

typedef struct StockNode{
    // 数据域
    Element data;

    // 下个节点的指针域
    struct StockNode *next;
}StockNode,*LinkStackPtr;

typedef struct LinkStack{
    // 栈的大小
    int count;

    // 记录栈顶元素
    LinkStackPtr top;
}LinkStack;

 链栈的操作:

// 当前栈是否为空栈
bool StatckEmpty(LinkStack *ls){
    if(ls->count > 0){
        return false;
    }
    return true;
}

// 入栈操作
Status Push(LinkStack *ls,Element v){
    LinkStackPtr e = (LinkStackPtr)malloc(sizeof(StockNode));
    e->data = v;

    // 把当前的栈顶元素值赋值给新节点的直接后继
    e->next = ls->top;
    // 将新节点赋值给栈顶指针
    ls->top = e;

    ls->count++;

    return OK;
}


// 弹栈
Status Pop(LinkStack *ls,Element *v){
    if(StatckEmpty(ls)){
        return ERROR;
    }

    *v = ls->top->data;

    // 用来记录要出栈的元素节点
    LinkStackPtr temp;
    temp = ls->top;

    // 使栈顶指针下移一位,指向后面的节点
    ls->top = ls->top->next;

    // 释放要出栈元素所在空间
    free(temp);

    // 将栈的大小更新
    ls->count--;

    return OK;
}

// 获取栈顶元素
void GetTop(LinkStack *ls,Element *v){
    if(!StatckEmpty(ls)){
        *v = ls->top->data;
    }
}

// 获取栈的元素个数
int StatckLength(LinkStack *ls){
    if(!StatckEmpty(ls)){
        return ls->count;
    }
    return -1;
}

// 初始化栈
LinkStack* InitStack(){
    LinkStack *ls;
    ls = (LinkStack *)malloc(sizeof(LinkStack));
    ls->top = NULL;
    ls->count = 0;
}

// 创建一个链栈
void CreateLinkStack(LinkStack *ls,int size){
    LinkStackPtr e;

    for(int i=1;i < size;i++){
        Push(ls,i);
    }
}

// 打印栈:
void LinkStackPrint(LinkStack *ls){
	LinkStackPtr p = ls->top;

	printf("[");
	while (p)
	{
		printf("%d", p->data);
		p = p->next;
		if(p){
            printf(", ");
		}
	}
	printf("]\n");
}

// 清空栈
Status ClearStack(LinkStack *ls){
    // 用来记录要出栈的元素节点
    LinkStackPtr temp;

    while(!stackEmpty(ls)){

        temp = ls->top;

        // 使栈顶指针下移一位,指向后面的节点
        ls->top = ls->top->next;

        // 释放要出栈元素所在空间
        free(temp);

        // 将栈的大小更新
        ls->count--;
    }
    return OK;
}

// 销毁栈
Status DestoryStack(LinkStack *ls){
    ClearStack(ls);
    free(ls);

    return OK;
}

测试代码:

void LinkStackTest(){
    LinkStack *ls = InitStack();
    printf("栈被初始化了\n");

    CreateLinkStack(ls,5);
    printf("%d个元素已入栈",5-1);
    LinkStackPrint(ls);

    printf("一个元素入栈:");
    Push(ls,5);
    LinkStackPrint(ls);

    Element pv;
    Element *resP;
    resP = &pv;
    Pop(ls,resP);
    printf("当前出栈元素:%d\n",*resP);

    int length = StatckLength(ls);
    printf("当前链栈的长度:%d\n",length);

    GetTop(ls,resP);
    printf("当前栈顶元素:%d\n",*resP);

    ClearStack(ls);
    //DestoryStack(ls);销毁后这个栈将不存在,而不是个空栈

    printf("清空整个栈后:");
    LinkStackPrint(ls);
}

 

运行结果 

算法与数据结构(c语言)——链栈存储结构及实现_第1张图片

你可能感兴趣的:(算法与数据结构)