考研党 数据结构(严蔚敏)Stack基本操作(纯C语言,与教材一致)

考研党 数据结构(严蔚敏)Stack基本操作(纯C语言,与教材一致)

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

#define STACK_INIT_LENGTH 20
#define STACK_INCREMENT 10

#define OK      1
#define ERROR   -1

typedef int Status;
typedef int ElemType;

typedef struct
{
    ElemType* top;
    ElemType* base;
    int size;
} Stack;

/*******函数声明*******/
Status initStack(Stack* s);
Status increaseStack(Stack* s);
Status clearStack(Stack* s);
Status destoryStack(Stack* s);

Status push(Stack* s,ElemType e);
Status pop(Stack* s, ElemType* e);

int isEmptyStack(Stack s);
int getStackSize(Stack s);
int getStackLength(Stack s);
void printElem(ElemType e);
void printStack(Stack s);

/*******函数定义*******/

//打印单个元素
void printElem(ElemType e)
{
    printf("%-4d", e);
}

//初始化堆栈
Status initStack(Stack* s)
{
    s->base = (ElemType*)malloc( sizeof(ElemType)*STACK_INIT_LENGTH );
    if( !s->base) 
    {
        return ERROR;//exit(0); 
    }
    s->top = s->base;
    s->size = STACK_INIT_LENGTH;
    return OK;

}

//打印堆栈
void printStack(Stack s)
{
    const ElemType* top = s.top;
    const ElemType* base = s.base; 
    while( top != base)
    {
        top--;
        printElem(*top);
    }
    printf("\n");
}

//弹出元素
Status pop(Stack* s, ElemType* e)
{
    if( getStackLength(*s) == 0)
    {
        return ERROR;
    }
    s->top--;
    *e = *s->top;
    return OK;
}

//压入元素
Status push(Stack* s, ElemType e)
{
    if( getStackLength(*s) == getStackSize(*s) )
    {
        int flag = increaseStack(s);
        if( OK != flag)
        {
            return ERROR;
        }
    }
    *s->top = e;
    s->top++;
    return OK;
}

//清空堆栈
Status clearStack(Stack* s)
{
    s->top = s->base;
    return OK;
}

//扩充堆栈的空间 
Status increaseStack(Stack* s)
{
    s->base = (ElemType*)realloc( s->base, sizeof(ElemType)* (s->size + STACK_INCREMENT));
    if( !s->base )
    {
        return ERROR;//exit(0);
    }
    s->top = s->base + s->size;
    s->size += STACK_INCREMENT;
    return OK;
}

//获取堆栈大小
int getStackSize(Stack s)
{
    return s.size;
}

//获取堆栈长度
int getStackLength(Stack s)
{
    return s.top - s.base;
}

//销毁堆栈
Status destoryStack(Stack* s)
{
    if( !s->base)
    {
        return ERROR;
    }
    free(s->base);
    s->size = 0;
    return OK;
}

//判断堆栈是否存在元素 
int isEmptyStack(Stack s)
{
    if( s.top == s.base)
        return 1;
    return 0; 
}
//main.c
/*堆栈测试 纯C语言*/
#include <stdio.h>
#include "Stack2.h"

#include <stdlib.h>
#include <time.h>

#define COUNT 12

int main(int argc, char const *argv[])
{
    srand((unsigned int)time(0));
    int i = 0;

    Stack s;
    initStack(&s);//初始化

    //循环压入元素
    printf("push元素:\n");
    for (i = 0; i < COUNT; ++i)
    {
        ElemType e = rand()%100;
        push(&s, e);
        printf("Length:%-4d Content: ",getStackLength(s));
        printStack(s);
    }

    //依次弹出元素
    printf("pop元素:\n");
    for (i = 0; i < COUNT; ++i)
    {
        ElemType e = 0;
        pop(&s, &e);
        printf("StackLength:%-4d poped:",getStackLength(s));
        printElem(e);
        printf("\n");
    }

    //查看堆栈元素是否为空 
    printf("Stack is %s Empty\n", isEmptyStack(s)?"":"not"); 

    //最后压入测试 
    push(&s, 100);

    //最后判断堆栈是否为空
    printf("Stack is %s Empty\n", isEmptyStack(s)?"":"not"); 

    //销毁堆栈
    destoryStack(&s);
    printf("Stack is destoried\n");

    return 0;
}

这里写图片描述

本代码示例为纯C语言编写的Stack基本操作,与数据结构(严蔚敏)课本讲述内容一致,可用于考研同学复习数据结构。

代码编译使用软件为Dev-cpp,代码与实际开发一定有不同,但是写代码的目的主要是为了理解数据结构的思想并掌握它。算法很美。

文件结构
Stack2.h(定义基本操作类型)
main.c(编写main函数进行测试)

祝愿18考研学生成功。

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值