当前位置:首页 > C语言
栈的顺序存储实验
来源:靑龍一笑的博客  作者:靑龍一笑  发布时间:2022-10-16 18:28:43  点击量:133  评论:0

    顺序存储栈的实现如下:

1、seqstack.h 文件

/*
 * 顺序存储栈
 */
#ifndef SEQSTACK_H__
#define SEQSTACK_H__

// 宏定义
#define MAXSIZE 5

// 顺序存储栈元素类型定义
typedef int datatype;

/*
 * 顺序存储栈结构
 * 使用定长数组来存储数据元素
 */
typedef struct node_st {
    datatype data[MAXSIZE];
    int top; // 当前栈顶元素位置
}seqstack;

/*
 * 初始化,创建栈
 * 返回结构体类型的指针
 */
seqstack *seqstack_create();

/*
 * 判断栈是否为空
 */
int seqstack_is_empty(seqstack *);

/*
 * 入栈
 */
int seqstack_push(seqstack *, datatype *);

/*
 * 出栈
 */
int seqstack_pop(seqstack *, datatype *);

/*
 * 查看栈顶元素
 */
int seqstack_top(seqstack *, datatype *);

/*
 * 遍历栈
 */
void seqstack_travel(seqstack *);

/*
 * 销毁栈
 */
void seqstack_destroy(seqstack *);

#endif

2、seqstack.c 文件

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

/*
 * 初始化,创建栈
 * 返回结构体类型的指针
 */
seqstack *seqstack_create() {
    seqstack *ptr;
    ptr = malloc(sizeof(*ptr));
    if (ptr == NULL) {
        return NULL;
    }
    // 初始化栈顶位置
    ptr->top = -1;

    return ptr;
}

/*
 * 判断栈是否为空
 */
int seqstack_is_empty(seqstack *ptr) {
    return (ptr->top == -1);
}

/*
 * 入栈
 */
int seqstack_push(seqstack *ptr, datatype *data) {
    if (ptr->top == (MAXSIZE -1)) {
        // 栈满
        return -1;
    }

    ptr->data[++ptr->top] = *data;
    return 0;
}

/*
 * 出栈
 */
int seqstack_pop(seqstack *ptr, datatype *data) {
    if (seqstack_is_empty(ptr)) {
        // 栈空
        return -1;
    }
    *data = ptr->data[ptr->top--];
    return 0;
}

/*
 * 查看栈顶元素
 */
int seqstack_top(seqstack *ptr, datatype *data) {
    if (seqstack_is_empty(ptr)) {
        // 栈空
        return -1;
    }
    *data = ptr->data[ptr->top];
    return 0;
}

/*
 * 遍历栈
 */
void seqstack_travel(seqstack *ptr) {
    int i; // 循环索引值
    if (seqstack_is_empty(ptr)) {
        // 栈空
        return; // 无返回值
    }
    for (i = 0; i <= ptr->top; i++) {
        printf("%d ", ptr->data[i]);
    }
    printf("\n");
    return; // 无返回值
}

/*
 * 销毁栈
 */
void seqstack_destroy(seqstack *ptr) {
    free(ptr);
    return; // 无返回值
}

3、main.c 文件

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

#include "seqstack.h"

int main() {
    int i; // 循环索引值
    int ret; // 返回状态值
    // 测试数据
    datatype arr[] = {24, 92, 70, 63, 56};
    // 顺序存储栈
    seqstack *stack = NULL;
    // 操作中的数据
    datatype op_data = 32;

    /* 初始化顺序存储栈 */
    stack = seqstack_create();
    if (stack == NULL) {
        fprintf(stderr, "初始化顺序存储栈 stack 失败!\n");
        exit(1);
    }

    /* 数据入栈 */
    for (i = 0; i < sizeof(arr)/sizeof(*arr); i++) {
        seqstack_push(stack, &arr[i]);
    }

    /* 遍历栈 */
    printf("栈中数据:");
    seqstack_travel(stack);

    /* 数据入栈 */
    ret = seqstack_push(stack, &op_data);
    if (ret == -1) {
        printf("栈满!无法继续入栈!\n");
    }

    /* 查看栈顶 */
    seqstack_top(stack, &op_data);
    ret = seqstack_top(stack, &op_data);
    if (ret == -1) {
        printf("栈空!\n");
    } else {
        printf("当前栈顶:%d\n", op_data);
    }

    /* 数据出栈 */
    printf("数据出栈:");
    while (seqstack_pop(stack, &op_data) == 0) {
        printf("%d ", op_data);
    }
    printf("\n");

    /* 查看栈顶 */
    ret = seqstack_top(stack, &op_data);
    if (ret == -1) {
        printf("栈空!\n");
    } else {
        printf("当前栈顶:%d\n", op_data);
    }

    /* 销毁栈 */
    seqstack_destroy(stack);

    exit(0);
}

4、Makefile 文件

OBJS=main.o seqstack.o
CC=gcc
CFLAGS+=-c -Wall -g
seqstack:$(OBJS)
    $(CC) $^ -o $@
%.o:%.c
    $(CC) $^ $(CFLAGS) -o $@
clean:
    $(RM) *.o seqstack -r

    执行效果:

root@RicenOS:~# make
gcc main.c -c -Wall -g -o main.o
gcc seqstack.c -c -Wall -g -o seqstack.o
gcc main.o seqstack.o -o seqstack
root@RicenOS:~# ./seqstack
栈中数据:24 92 70 63 56
栈满!无法继续入栈!
当前栈顶:56
数据出栈:56 63 70 92 24
栈空!
版权所有 © 2005-2023 靑龍一笑的博客  Powered by C.S.Ricen
Copyright © 2005-2023 by www.ricensoftwares.com.cn  All Rights Reserved.

欢迎光临本站,这里是靑龍一笑的博客。

因资金匮乏,本站已迁到国外的免费空间,可能导致本站的访问速度较慢,由此给您带来的不便,敬请谅解。

您可以通过下方的“支持本站建设”链接,给本站提供资金支持。

Free Web Hosting