美文网首页
C语言实现线性栈

C语言实现线性栈

作者: obsession_me | 来源:发表于2018-05-20 00:07 被阅读0次

new version

#include <stdlib.h>
#include <string.h>

#define MAXSIZE 100
#define SINCREMENT 10

typedef char ElemType;
typedef struct{
    ElemType *base;
    ElemType *top;  // 栈顶
    int stacksize;
}SqStack;

void initStack(SqStack *s){
    // 构造一个空栈
    s->base = malloc(MAXSIZE*sizeof(ElemType));  // 分配空间
    if (!s->base) exit(1);  // error
    // 此时为空栈,因此设置s->top=s->base;
    s->top = s->base;
    s->stacksize = MAXSIZE;
}

void destoryStack(SqStack *s){
    // 销毁一个栈
    free(s->base);
}

void clearStack(SqStack *s){
    // 将S清空为一个空栈
    if (!s->base) exit(1); // 未初始化的栈,拒绝处理
    s -> top = s->base;
    *(s->base) = 0;
}

int isEmpty(SqStack s){
    // 判断是否为空栈
    if (s.top == s.base){
        return 1;  // True
    }else{
        return 0; // False
    }
}

int stackLength(SqStack s){
    // 返回栈的长度
    // return (s.top - s.base)/sizeof(ElemType); // error
    return (s.top - s.base);
}

void getTop(SqStack s, ElemType *e){
    // 用e返回栈顶元素
    if (isEmpty(s)) *e =0 ;  // no elements
    e = s.top - 1;
}

void push(SqStack *s, ElemType e){
    // 压入栈
    if(stackLength(*s) >= s->stacksize-1){
        // remalloc memory
        s->base = realloc(s->base, s->stacksize+SINCREMENT*sizeof(ElemType));
        if (!s->base) exit(1); // error
    }
    *s->top = e;
    s->top++;
    // if(stackLength(*s) >= s->stacksize)
}

void *pop(SqStack *s, ElemType *e){
    // 弹出栈
    if (isEmpty(*s)) exit(1); // none to pop
    *e = *(s->top-1);  // 这里应该是用指向,而不是用赋值
    s->top--;
}

void traverse(SqStack s, void (*visit)(ElemType *)){
    while (isEmpty(s)==0){
        ElemType *e;
        e = malloc(sizeof(ElemType));
        pop(&s, e);
        visit(e);
    }
}

void print(ElemType *e){
    printf("the value is %d\n", *e);
}

new version(depreciated) 这里实际因为只是定义了一个空指针,而未分配空间所以会出现各种很难debug的错误,所以我们使用新的版本。

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

#define MAXSIZE 100
#define SINCREMENT 10

typedef int ElemType;
typedef struct{
    ElemType *base;
    ElemType *top;  // 栈顶
    int stacksize;
}SqStack;

void initStack(SqStack *s){
    // 构造一个空栈
    s->base = malloc(MAXSIZE*sizeof(ElemType));  // 分配空间
    if (!s->base) exit(1);  // error
    // 此时为空栈,因此设置s->top=s->base;
    s->top = s->base;
    s->stacksize = MAXSIZE;
}

void destoryStack(SqStack *s){
    // 销毁一个栈
    free(s->base);
}

void clearStack(SqStack *s){
    // 将S清空为一个空栈
    if (!s->base) exit(1); // 未初始化的栈,拒绝处理
    s -> top = s->base;
    *(s->base) = 0;
}

int isEmpty(SqStack s){
    // 判断是否为空栈
    if (s.top == s.base){
        return 1;  // True
    }else{
        return 0; // False
    }
}

int stackLength(SqStack s){
    // 返回栈的长度
    // return (s.top - s.base)/sizeof(ElemType); // error
    return (s.top - s.base);
}

void getTop(SqStack s, ElemType *e){
    // 用e返回栈顶元素
    if (isEmpty(s)) *e =0 ;  // no elements
    e = s.top - 1;
}

void push(SqStack *s, ElemType e){
    // 压入栈
    if(stackLength(*s) >= s->stacksize-1){
        // remalloc memory
        s->base = realloc(s->base, s->stacksize+SINCREMENT*sizeof(ElemType));
        if (!s->base) exit(1); // error
    }
    *s->top = e;
    s->top++;
    // if(stackLength(*s) >= s->stacksize)
}

void *pop(SqStack *s, ElemType *e){
    // 弹出栈
    if (isEmpty(*s)) exit(1); // none to pop
    *e = *(s->top-1);  // 这里应该是用指向,而不是用赋值
    s->top--;
}

void traverse(SqStack s, void (*visit)(ElemType *)){
    while (isEmpty(s)==0){
        ElemType *e;
        pop(&s, e);
        visit(e);
    }
}

void print(ElemType *e){
    printf("the value is %d\n", *e);
}

void main(){
    SqStack stack;
    initStack(&stack);
    for (int i=0; i<=5; ++i){
        push(&stack, i);
    }
    traverse(stack, print);
}

this version is not recommended.

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

#define MAXSIZE 100
#define SINCREMENT 10

typedef int ElemType;
typedef struct{
    ElemType *base;
    ElemType *top;  // 栈顶
    int stacksize;
}SqStack;

void initStack(SqStack *s){
    // 构造一个空栈
    s->base = malloc(MAXSIZE*sizeof(ElemType));  // 分配空间
    if (!s->base) exit(1);  // error
    // 此时为空栈,因此设置s->top=s->base;
    s->top = s->base;
    s->stacksize = MAXSIZE;
}

void destoryStack(SqStack *s){
    // 销毁一个栈
    free(s->base);
}

void clearStack(SqStack *s){
    // 将S清空为一个空栈
    if (!s->base) exit(1); // 未初始化的栈,拒绝处理
    s -> top = s->base;
    *(s->base) = 0;
}

int isEmpty(SqStack s){
    // 判断是否为空栈
    if (s.top == s.base){
        return 1;  // True
    }else{
        return 0; // False
    }
}

int stackLength(SqStack s){
    // 返回栈的长度
    // return (s.top - s.base)/sizeof(ElemType); // error
    return (s.top - s.base);
}

void getTop(SqStack s, ElemType *e){
    // 用e返回栈顶元素
    if (isEmpty(s)) *e =0 ;  // no elements
    e = s.top - 1;
}

void push(SqStack *s, ElemType e){
    // 压入栈
    if(stackLength(*s) >= s->stacksize-1){
        // remalloc memory
        s->base = realloc(s->base, s->stacksize+SINCREMENT*sizeof(ElemType));
        if (!s->base) exit(1); // error
    }
    *s->top = e;
    s->top++;
    // if(stackLength(*s) >= s->stacksize)
}

ElemType *pop(SqStack *s){
    // 弹出栈
    if (isEmpty(*s)) exit(1); // none to pop
    ElemType* e = s->top-1;  // 这里应该是用指向,而不是用赋值
    s->top--;
    return e;
}

void traverse(SqStack s, void (*visit)(ElemType *)){
    while (isEmpty(s)==0){
        ElemType *e;
        e = pop(&s);
        visit(e);
    }
}

void print(ElemType *e){
    printf("the value is %d\n", *e);
}

void main(){
    SqStack stack;
    initStack(&stack);
    for (int i=0; i<=5; ++i){
        push(&stack, i);
    }
    traverse(stack, print);
}

相关文章

  • C语言实现线性栈

    new version new version(depreciated) 这里实际因为只是定义了一个空指针,而未分...

  • C++语言实现顺序栈

    C++语言实现顺序栈 在写C语言实现顺序栈的时候,我已经向大家介绍了>栈的特点以及介绍了栈的相关操作,并利用C语言...

  • 3. 栈的操作

    1. 栈的操作-c语言实现2. 栈操作的实现-顺序栈和链栈 3. 栈的实现与遍历4. c语言的函数调用栈5. 两个...

  • 动态栈的存储结构及算法C语言实现

    动态栈的存储结构及算法C语言实现

  • python数据结构教程 Day3

    本节重点: 线性结构介绍 栈结构介绍 栈结构ADT实现 栈在问题中的应用 一、线性结构 定义: 线性结构是一种有序...

  • 栈的实现(C语言)

    栈的定义 栈是一种只能在一端进行插入或删除操作的线性表。运行插入或删除操作的一端称为栈顶,栈的插入和删除一般叫入栈...

  • (一)线性表C语言实现

    线性表 线性表是最简单最常用的一种数据结构 C语言实现 实例

  • GO语言实现 一 栈和队列

    线性表中,栈和队列是非常重要的两种数据结构,本文将就这两种数据结构进行 golang语言实现 一.栈的实现 我们需...

  • C语言接口与实现之异常处理try-except

    前言 最近在学习《C语言接口与实现》,目前阅读到第四章,关于如何实现C语言异常捕获和断言处理,其中的异常捕获的栈和...

  • 34_栈的概念及实现(上)

    关键词:栈的定义、栈的操作、栈的实现、StaticStack.h的实现 0. 栈的定义 栈是一种特殊的线性表 栈仅...

网友评论

      本文标题:C语言实现线性栈

      本文链接:https://www.haomeiwen.com/subject/tahzdftx.html