链栈的表示及基本操作的实现

2-马增来
2-马增来   发布于 2018-10-21 17:26
阅读量: 224

写了一点链栈的基本操作,第一次发文,如发现错误之处请大家及时指正。

// 补充:链栈的基本操作

#include <stdio.h>
#include <stdlib.h>

typedef int ElemType;

void visit(ElemType e)
{
	printf("%d\n", e);
}

// 存储结构定义
typedef struct SNode{
    ElemType  data;
    struct SNode * next;
}SNode, *LinkStack;

// 链栈的初始化
bool InitStack(LinkStack * S)
{
    *S = NULL;
    return true;
}

// 链栈的销毁
void DestroyStack(LinkStack * S)
{
    while(*S){
        LinkStack p = *S;
        *S = p->next;
        free(p);
    }
}

// 得到栈顶元素
bool GetTop(LinkStack S, ElemType * e)
{
    if(S == NULL)   // 栈空
        return false;
    *e = S->data;
    return true;
}

// 元素入栈
bool Push(LinkStack * S, ElemType e)
{
    LinkStack p = (LinkStack) malloc(sizeof(SNode));
    if(!p)
        return false;
    p->data = e;
    p->next = *S;
    *S = p;
    return true;
}

// 元素出栈
bool Pop(LinkStack * S, ElemType * e)
{
    if(*S == NULL)
        return false;
    *e = (*S)->data;
    LinkStack p = *S;
    *S = p->next;
    free(p);
    return true;
}

// 得到栈长
int StackLength(LinkStack S)
{
    int i = 0;
    while(S){
        S = S->next;
        i++;
    }
    return i;
}

// 判断栈是否为空
bool StackEmpty(LinkStack S)
{
    if(S == NULL)
        return true;
    else
        return false;
}

// 遍历链栈
void StackTraverse(LinkStack S, void (*fp)(ElemType))
{
    while(S){
        (*fp)(S->data);
        S = S->next;
    }
}

int main(void)
{
    // TODO: Place your test code here

    LinkStack myStack;
    ElemType e;

    if(InitStack(&myStack))
        printf("初始化成功!\n");
    
    if(StackEmpty(myStack))
        printf("刚刚初始化后是一个空栈!\n");

    Push(&myStack, 1);
    Push(&myStack, 2);
    Push(&myStack, 3);
    Push(&myStack, 4);

    if(!StackEmpty(myStack))
        printf("进行插入后便不是一个空栈!\n");

    printf("栈长为:%d\n", StackLength(myStack));

    printf("遍历栈中的元素如下:\n");
    StackTraverse(myStack, visit);

    GetTop(myStack, &e);
    printf("栈顶元素为:%d\n", e);

    Pop(&myStack, &e);
    printf("删除栈顶后的栈为:\n");
    StackTraverse(myStack, visit);
    printf("删除栈顶后的栈长为:%d\n", StackLength(myStack));

    DestroyStack(&myStack);

    return 0;
}

 

收藏 转发 评论