1、数据结构-链式栈的实现-C语言

//链式栈的链式结构
typedef struct StackNode
{
    int data;
    struct StackNode *next;
} StackNode,*LinkStack;

//链式栈初始化---1
void InitStack(LinkStack* S);
//链式栈的销毁---2
void DestroyStack(LinkStack* S);
//链式栈的清空---3
void ClearStack(LinkStack* S);
//判断链式栈是否为空---4
void StackEmpty(LinkStack S);
//链式栈的长度---5
int StackLength(LinkStack S);
//取链式栈顶元素---6
void GetTop(LinkStack S);
//入链式栈操作---7
void Push(LinkStack* S, int value);
//出链式栈操作---8
void Pop(LinkStack* S,int* value);
//依次访问链式栈元素---9
void StackTraverse(LinkStack S);
void ShowHelp();

//----------------------------------------------------

void ShowHelp()
{
    printf("1---初始化链式栈\n");
    printf("2---销毁链式栈\n");
    printf("3---清空链式栈\n");
    printf("4---判断链式栈是否为空\n");
    printf("5---链式栈的长度\n");
    printf("6---取链式栈顶元素\n");
    printf("7---入链式栈操作\n");
    printf("8---出链式栈操作\n");
    printf("9---依次访问链式栈元素\n");
}

void InitStack(LinkStack* S)
{
    //栈顶指针指向空,刚开始只有一个指针,不和单链表一样有头结点。不需要分配空间。
    *S = NULL;
}

void DestroyStack(LinkStack* S)
{
    LinkStack q;
    while(*S){
        q = *S;
        *S = (*S)->next;
        free(q);
    }
}

void ClearStack(LinkStack* S)
{
    LinkStack q;
    while(*S){
        q = *S;
        *S = (*S)->next;
        free(q);
    }
    *S = NULL;
    //和销毁差别在于,销毁后,最后又初始化了一下
}

void StackEmpty(LinkStack S)
{
    if(S == NULL)
        printf("此栈为空栈。\n");
    else
        printf("此栈不为空栈。\n");
}

int StackLength(LinkStack S)
{
    int num = 0;
    LinkStack q = S;
    while(q){
        num++;
        q = q->next;
    }
    return num;
}

void GetTop(LinkStack S)
{
    if(!S)
    {
        printf("此栈为空。\n");
        return;
    }
    int num;
    num = S->data;
    printf("此栈顶元素为%d。\n",num);
}

void Push(LinkStack* S, int value)
{
    LinkStack p = (StackNode*) malloc(sizeof(StackNode));
    if(!p){
        printf("分配失败\n");
        return ;
    }

    p->data = value;
    p->next = *S;
    *S = p;

    printf("入栈成功\n");
}

void Pop(LinkStack* S,int* value)
{
    if(*S == NULL)
    {
        printf("栈中无元素,不能再进行出栈操作.\n");
        return;
    }
    *value = (*S)->data;
    LinkStack p = *S;
    *S = (*S)->next;

    free(p);

    printf("出栈成功\n");
}

void StackTraverse(LinkStack S)
{
    if(S == NULL){
        printf("此栈为空。\n");
        return;
    }
    LinkStack p = S;
    printf("从栈顶到栈底值依次为:\n");
    while(p != NULL)
    {
        printf("%d   ",p->data);
        p = p->next;
    }
    printf("\n");
}

C语言数据结构-链式栈的实现-初始化、销毁、长度、取栈顶元素、查找、入栈、出栈、显示操作的更多相关文章

  1. C语言数据结构-链式队列的实现-初始化、销毁、清空、长度、队列头元素、插入、删除、显示操作

    1.数据结构-链式队列的实现-C语言 typedef struct QNode { int data; struct QNode *next; }QNode,*QueuePtr; typedef st ...

  2. C语言数据结构-循环队列的实现-初始化、销毁、清空、长度、队列头元素、插入、删除、显示操作

    1.数据结构-循环队列的实现-C语言 #define MAXSIZE 100 //循环队列的存储结构 typedef struct { int* base; //基地址 int _front; //头 ...

  3. C语言数据结构-队列的实现-初始化、销毁、清空、长度、队列头元素、插入、删除、显示操作

    1.数据结构-队列的实现-C语言 //队列的存储结构 #define MAXSIZE 100 typedef struct { int* base; //基地址 int _front; //头指针 i ...

  4. C语言数据结构-栈的实现-初始化、销毁、长度、取栈顶元素、查找、入栈、出栈、显示操作

    1.数据结构-栈的实现-C语言 #define MAXSIZE 100 //栈的存储结构 typedef struct { int* base; //栈底指针 int* top; //栈顶指针 int ...

  5. C语言实现链栈的初始化&进栈&出栈&读取栈顶元素

    /*链表实现栈的一系列操作*/ #include<stdio.h> #include<stdlib.h> #define OK 1 #define ERROR 0 typede ...

  6. C语言实现顺序栈的初始化&进栈&出栈&读取栈顶元素

    /*顺序表实现栈的一系列操作*/ #include<stdio.h> #include<stdlib.h> #define Stack_Size 50 //设栈中元素个数为50 ...

  7. C语言数据结构链栈(创建、入栈、出栈、取栈顶元素、遍历链栈中的元素)

    /**创建链栈*创建一个top指针代表head指针*采用链式存储结构*采用头插法创建链表*操作 创建 出栈 入栈 取栈顶元素*创建数据域的结构体*创建数据域的名称指针*使用随机函数对数据域的编号进行赋 ...

  8. 【转】【数据结构】【有n个元素依次进栈,则出栈序列有多少种】

    卡特兰数 大神解释:https://blog.csdn.net/akenseren/article/details/82149145      权侵删 原题 有一个容量足够大的栈,n个元素以一定的顺序 ...

  9. C语言数据结构——第三章 栈和队列

    三.栈和队列 栈和队列是两种重要的线性结构.从数据结构的角度来看,栈和队列也是线性表,它的特殊性在于栈和队列的基本操作是线性表操作的子集,它们的操作相对于线性表来说是受到限制的,因此,可以称其为限定性 ...

随机推荐

  1. postgresql 主从复制并切换

    1 环境 192.168.19.145 Kylin 3.3 mysqlhq  9.5.2  psql_master192.168.19.227 Kylin 3.3 mysql3    9.5.2  p ...

  2. Celery-4.1 用户指南: Configuration and defaults (配置和默认值)

    这篇文档描述了可用的配置选项. 如果你使用默认的加载器,你必须创建 celeryconfig.py 模块并且保证它在python路径中. 配置文件示例 以下是配置示例,你可以从这个开始.它包括运行一个 ...

  3. linux uid/euid/suid

    Each UNIX process has 3 UIDs associated to it. Superuser/root is UID=0. UID Read UID. It is of the u ...

  4. python对MySQL进行数据的插入、更新和删除之后需要commit,数据库才会真的有数据操作。(待日后更新)

    今天在尝试用下面的python代码对MySQL进行数据的插入.更新和删除时, 突然发现代码执行成功, 通过代码查询也显示数据已经插入或更新, 但是当我在MySQL客户端通过SQL语句查询时, 数据库中 ...

  5. Android 媒体编解码器(转)

    媒体编解码器 MediaCodec类是用来为低级别的媒体编码和解码的媒体编解码器提供访问.您可以实例化一个MediaCodec类通过调用createEncoderByType()方法来进行对媒体文件进 ...

  6. css知多少(3)——样式来源与层叠规则(转)

    css知多少(3)——样式来源与层叠规则   上一节<css知多少(2)——学习css的思路>有几个人留言表示思路很好.继续期待,而且收到了9个赞,我还是比较欣慰的.没看过的朋友建议先去看 ...

  7. 开发工具 idea 激活方法

    1. 到网站 http://idea.lanyus.com/ 获取注册码. 2.填入下面的license server: http://intellij.mandroid.cn/ http://ide ...

  8. 关于PDF的一些书籍

    PDF Explained: The ISO Standard for Document Exchange https://ssearch.oreilly.com/?q=PDF+

  9. Git 之 修复bug

    前面介绍了Git版本控制,为我们省去了很多不必要的麻烦. 回滚 有没有想过,在我们开发过程中,修改需要是常有的事,如果我们现在不想要这个功能了,那么如何回到之前的版本呢?回滚,回到上一个版本. 那如果 ...

  10. Inheritance with EF Code First: Part 1 – Table per Hierarchy (TPH)

    以下三篇文章是Entity Framework Code-First系列中第七回:Entity Framework Code-First(7):Inheritance Strategy 提到的三篇.这 ...