顺序存储栈的实现如下:
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 文件
CC=gcc
CFLAGS+=-c -Wall -g
seqstack:$(OBJS)
$(CC) $^ -o $@
%.o:%.c
$(CC) $^ $(CFLAGS) -o $@
clean:
$(RM) *.o seqstack -r
执行效果:
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
栈空!
Copyright © 2005-2023 by www.ricensoftwares.com.cn All Rights Reserved.