zoukankan      html  css  js  c++  java
  • 栈的C语言实现

    栈的C语言实现

    简述

    栈是实现后进先出(FIFO)策略的一种基本数据结构。我们可以通过多种方式实现栈这种数据结构。

    我们可以用下面的结构体来定义栈:

    typedef struct stack {

             inttop;

             intkey[M];

    } stack;

    栈的一个属性s.top指向最新插入的元素。栈的另外一个属性s.key[]存放的是元素的关键字,包含的元素为s.key[1…s.top],其中s.key[1]是栈底元素,s.key[s.top]是栈顶元素。当s.top = 0时,栈空。

    代码实现

    下面程序省略了对上溢和下溢的检查。main()函数中的语句主要是栈的初始化和测试。

    数组实现

    最简单的方法也许就是数组了,不用考虑参数传递问题。

    源代码如下:

    # include <stdio.h>

    # define M 100

    int stackEmpty(int s[]);

    void push(int s[], int x);

    int pop(int s[]);

    int main(void)

    {

             ints[M];

             s[0]= 0;

             printf("stackEmpty- %d\n", stackEmpty(s));

             push(s,2);

             push(s,5);

             printf("stackEmpty- %d\n", stackEmpty(s));

             printf("pop- %d\n", pop(s));

             return0;

    }

    int stackEmpty(int s[])

    {

             if(s[0]== 0) {

                       return1;

             }else {

                       return0;

             }

    }

    void push(int s[], int x)

    {

             s[0]++;

             s[s[0]]= x;

    }

    int pop(int s[])

    {

             if(s[0]== 0) {

                       return-1;

             }else {

                       returns[s[0]--];

             }

    }

    参数传值实现

    注意:在参数传递的过程中使用的是地址

    源代码如下:

    # include <stdio.h>

    # define M 100

    typedef struct stack {

             inttop;

             intkey[M];

    } stack;

    int stackEmpty(stack s);

    void push(stack * s, int x);

    int pop(stack * s);

    int main(void)

    {

             stacks;

             s.top= 0;

             /*测试代码 */

             push(&s,2);

             push(&s,3);

             printf("pop- %d\n", pop(&s));

             printf("stackEmpty- %d", stackEmpty(s));

    }

    int stackEmpty(stack s)

    {

             if(s.top== 0) {

                       return1;

             }else {

                       return0;

             }

    }

    void push(stack * sp, int x)

    {

             sp-> top += 1;

             sp-> key[sp -> top] = x;

    }

    int pop(stack * sp)

    {

             if(sp-> top == 0) {

                       return-1;

             }else {

                       sp-> top--;

                       returnsp -> key[sp -> top + 1];

             }

    }

    引用实现

    引用很好用,可惜C语言里没有。

    源代码如下:

    # include <stdio.h>

    # define M 100

    typedef struct stack {

             inttop;

             intkey[M];

    } stack;

    int stackEmpty(stack s);

    void push(stack & s, int x);

    int pop(stack & s);

    int main(void)

    {

             stacks;

             s.top= 0;

             /*测试代码 */

             push(s,2);

             push(s,3);

             printf("pop- %d\n", pop(s));

             printf("stackEmpty- %d", stackEmpty(s));

    }

    int stackEmpty(stack s)

    {

             if(s.top== 0) {

                       return1;

             }else {

                       return0;

             }

    }

    void push(stack & s, int x)

    {

             s.top+= 1;

             s.key[s.top]= x;

    }

    int pop(stack & s)

    {

             if(s.top== 0) {

                       return-1;

             }else {

                       s.top--;

                       returns.key[s.top + 1];

             }

    }

    全局变量实现

    全局变量可以一直保存变量的值,不会因某个函数的结束而销毁,并且不用作为参数传递给函数。

    源代码如下:

    # include <stdio.h>

    # define M 100

    typedef struct stack {

             inttop;

             intkey[M];

    } stack;

    stack s;

    int stackEmpty(void);

    void push(int x);

    int pop(void);

    int main(void)

    {

             s.top= 0;

             /*测试代码 */

             push(2);

             push(3);

             printf("pop- %d\n", pop());

             printf("stackEmpty- %d", stackEmpty());

    }

    int stackEmpty(void)

    {

             if(s.top== 0) {

                       return1;

             }else {

                       return0;

             }

    }

    void push(int x)

    {

             s.top+= 1;

             s.key[s.top]= x;

    }

    int pop(void)

    {

             if(s.top== 0) {

                       return-1;

             }else {

                       s.top--;

                       returns.key[s.top + 1];

             }

    }

    另一种数组实现

    第一种数组实现的时候使用s[0]表示s.top,如果定义一个新变量stop,可以让程序变得更加简单易读。

    源代码如下:

    # include <stdio.h>

    # define M 100

    int s[M];

    int stop;

    //stop = 0;    //外部变量不能赋值吗??

    int stackEmpty(void);

    void push(int x);

    int pop();

    int main(void)

    {

             stop= 0;

             printf("stackEmpty- %d\n", stackEmpty());

             push(3);

             printf("stackEmpty- %d\n", stackEmpty());

             push(5);

             //printf("pop- %d - %d\n", pop(), pop());    //这是一个未定义行为

             printf("pop- %d\n", pop());

             printf("pop- %d\n", pop());

             printf("stackEmpty- %d\n", stackEmpty());

             return0;

    }

    int stackEmpty(void)

    {

             if(stop== 0) {

                       return1;

             }else {

                       return0;

             }

    }

    void push(int x)

    {

             s[++stop]= x;

    }

    int pop(void)

    {

             returns[stop--];

    }

    小记

    作为一种基本的数据结构,栈的实现还是挺简单的。

    (全文完)

  • 相关阅读:
    夺命雷公狗-----React---26--小案例之react经典案例todos(统计部分的完成)
    夺命雷公狗-----React---25--小案例之react经典案例todos(单选框的修改)
    夺命雷公狗-----React---24--小案例之react经典案例todos(单条任务的删除)
    夺命雷公狗-----React---23--小案例之react经典案例todos(完成添加任务)
    夺命雷公狗-----React---22--小案例之react经典案例todos(完成数据的遍历)
    react.js语法为了更好的兼容可以选以下这种方法配置即可
    无语啊,sublime给我弄乱玩,玩坏了,而且安装插件也安装不了
    夺命雷公狗-----React---21--小案例之心情留言板
    07-THREE.JS 各种形状的几何图形
    03-THREE.JS GUI使用
  • 原文地址:https://www.cnblogs.com/javawebsoa/p/3057257.html
Copyright © 2011-2022 走看看