DynamicStack 动态栈C语言算法(链表栈)

动态栈

通过链表形式表示的静态栈,栈的长度可以随时拓展。相比较静态栈,其占用空间会稍大一些。

当通过链表表示动态栈时,为了减少遍历次数,可以把头结点当做栈顶元素,每次出栈与入栈都对头结点操作,可以减少遍历。

实现功能

  1. 初始化栈
  2. 入栈
  3. 出栈
  4. 清空栈
  5. 取栈的大小
  6. 打印栈的内容

代码

GitHub:https://github.com/MagicDevilZhang/myDataStructProject/blob/master/DynamicStack.cpp

以下代码纯手工编写,欢迎指出错误和优化方法。

/**
 * @ProjectName:DynamicStack 动态栈的算法实现(链表栈)
 * @Author: MagicDevil.Top (MagicDevil.Zhang@gmail.com)
 * @Description: 实现功能:初始化栈、入栈、出栈、清空栈、取栈的大小、打印栈的内容
 */

#include <stdio.h>
#include <windows.h>

#define SUCCESS 1
#define ERROR -1

#define ElemType int
#define StatusType int

typedef struct StackNode
{
    ElemType data;
    struct StackNode *next;

} StackNode, *Stack;

//1.初始化栈空间
StatusType InitStack(Stack &S)
{
    S = (Stack)malloc(sizeof(StackNode));
    S->data = NULL;
    S->next = NULL;
    return SUCCESS;
}

//2.入栈
StatusType PushStack(Stack &S, ElemType content)
{
    if (!S || content == ERROR)
    { //但栈未初始化或传入元素不存在返回ERROR
        return ERROR;
    }
    if (!S->data)
    { //覆盖空链表栈
        S->data = content;
        return SUCCESS;
    }
    //新建一个新链表存放内容
    Stack newstack;
    InitStack(newstack);
    newstack->data = content;
    //将新链表设为头结点连接后续链表
    newstack->next = S;
    S = newstack;
    return SUCCESS;
}

//3.出栈
ElemType PopStack(Stack &S)
{
    if (S->next)
    { //未到栈底
        Stack outstack = S;
        ElemType out = outstack->data;
        S = S->next;
        free(outstack);
        return out;
    }
    if (S->data)
    { //到达栈底元素时
        ElemType out = S->data;
        S->data = NULL;
        return out;
    }
    return ERROR;
}

//4.清空栈
StatusType ClearStack(Stack &S)
{
    if (S->next)
    {
        ClearStack(S->next); //遍历所有元素
    }
    free(S->next); //清空尾巴保留头结点
    S->data = NULL;
    S->next = NULL;
    return SUCCESS;
}

//5.取栈的大小
int getStackNum(Stack &S)
{
    if (S->data)
    {
        return 1 + getStackNum(S->next);
    }
    return 0;
}

//6.打印栈的内容
StatusType PrintStack(Stack &S)
{
    int foot = 0;
    int flag = 0;
    int num = 0;

    Stack stack;
    stack = S;

    printf("Stack Information\n");
    while (flag == 0)
    {
        if (stack->next == NULL)
        { //当遍历到最后一个元素时退出
            flag = 1;
        }
        num++;
        printf(" |- Stack %d : %d\n", foot++, stack->data);
        stack = stack->next;
    }
    printf("Num : %d\n", num);
    return SUCCESS;
}

int main(int argc, char const *argv[])
{

    Stack stack, q;
    InitStack(stack);
    InitStack(q);

    PushStack(stack, 1);
    PushStack(stack, 3);
    PushStack(stack, 5);
    PushStack(stack, 7);

    PrintStack(stack);

    PushStack(q, PopStack(stack));
    PushStack(q, PopStack(stack));
    PushStack(q, PopStack(stack));
    PushStack(q, PopStack(stack));
    PushStack(q, PopStack(stack));
    PrintStack(q);

    printf("%d\n", getStackNum(stack));

    system("pause");
    return 0;
}

Studying & Working in Programming and Photography.
E-mail : MagicDevil.Zhang@gmail.com
More About Me : www.magicdevil.top
Love Sharing & Open Source.

没有更多推荐了,返回首页

私密
私密原因:
请选择设置私密原因
  • 广告
  • 抄袭
  • 版权
  • 政治
  • 色情
  • 无意义
  • 其他
其他原因:
120
出错啦
系统繁忙,请稍后再试