栈
栈:类似于一个容器,如我们生活中的箱子,我们向箱子里放东西,那么最先放的东西是最后才能拿出来的
代码实现
#include <stdio.h>
#include <stdlib.h>
#define MAX_SIZE 100
typedef struct {
int* base; // 栈底指针
int* top; // 栈顶指针
int size; // 栈元素个数
}stack;
// 初始化栈
int initStack(stack* s) {
s->top = (int*)malloc(sizeof(int) * MAX_SIZE); // 开辟一块数字栈的内存空间,最大存储100个
if (s->top == NULL) { // 当内存空间不足时初始化失败
printf("init error");
return -1;
}
s->base = s->top; // 初始化栈的栈顶和栈底是同一位置
s->size = 0; // 初始化栈的元素个数为0
return 1; // 初始化栈成功
}
// 压栈
void push(stack* s, int data) {
if (s->size >= MAX_SIZE) { // 如果栈的元素超过最大个数则push失败
printf("push error");
return;
}
*(s->top) = data; // 将栈顶当前指向的内存空间赋值
s->top++; // 栈顶指针向上移动
s->size++; // 栈的元素个数增加
}
//出栈
int pop(stack* s) {
if (s->top == s->base) { // 如果是空栈则pop失败
printf("pop error");
return -1;
}
int* tmp = s->top; // 临时指针指向栈的栈顶
int result = *(--tmp); // 将临时指针移动下一个位置并取出值(这个位置才是栈顶的元素所在位置)
*(tmp + 1) = NULL; // 栈顶元素置空
s->top--; // 栈顶指向下一个位置
s->size--; // 栈的元素个数减少
return result; // 返回栈顶的值
}
// 遍历打印栈
void displayStack(stack* s) {
stack* tmp = s;
for (int i = 0; i < tmp->size; i++) {
printf("%d ",*(tmp->base + i)); // 从栈底向栈顶打印元素
}
printf("\n");
}
int main() {
stack* s = (stack*)malloc(sizeof(stack));
if (s == NULL) {
printf("内存不足无法运行");
}
else {
initStack(s);
printf("初始化栈成功\n");
printf("进栈:1\n");
push(s, 1);
printf("当前栈为:\n");
displayStack(s);
printf("进栈:2\n");
push(s, 2);
printf("当前栈为:\n");
displayStack(s);
printf("进栈:3\n");
push(s, 3);
printf("当前栈为:\n");
displayStack(s);
printf("出栈:%d\n", pop(s));
printf("现在栈为:\n");
displayStack(s);
}
return 0;
}
作者水平有限,如有错误请批评指正