数据结构 - (3)栈的操作
一、栈(Stack)的介绍
栈(stack)又名堆栈,它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。
二、具体
1、添加相关头文件
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
2、定义栈
typedef struct Stack {
int *data;
int top, size;
} Stack;
3、初始化栈
Stack *init(int n) {
Stack *s = (Stack *)malloc(sizeof(Stack));
s->data = (int *)malloc(sizeof(int) * n);
s->size = n;
s->top = -1;
return s;
}
4、判断是否为空及查看栈顶
int empty(Stack *s) {
return s->top == -1;
}
int top(Stack *s) {
if (empty(s)) return 0;
return s->data[s->top];
}
5、插入
int push(Stack *s, int val) {
if (s == NULL) return 0;
if (s->top + 1 == s->size) return 0;
s->top += 1;
s->data[s->top] = val;
return 1;
}
6、出栈操作
int pop(Stack *s) {
if (s == NULL) return 0;
if (empty(s)) return 0;
s->top -= 1;
return 1;
}
7、清空
void clear(Stack *s) {
if (s == NULL) return ;
free(s->data);
free(s);
return ;
}
8、输出栈
void output(Stack *s) {
printf("stack(%d) = [", s->top + 1);
for (int i = s->top; i >= 0; i--) {
printf(" %d", s->data[i]);
}
printf("]\n");
return ;
}
9、主函数(随机进行20次随机测试)
int main() {
srand(time(0));
#define MAX_OP 20
Stack *s = init(MAX_OP);
for (int i = 0; i < MAX_OP; i++) {
int op = rand() % 2, val = rand() % 100;
switch (op) {
case 0: {
printf("push %d to stack = %d\n", val, push(s, val));
} break;
case 1: {
printf("pop %d from stack = %d\n", top(s), pop(s));
}
}
output(s);
}
return 0;
}
10、完整代码
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
typedef struct Stack {
int *data;
int top, size;
} Stack;
Stack *init(int n) {
Stack *s = (Stack *)malloc(sizeof(Stack));
s->data = (int *)malloc(sizeof(int) * n);
s->size = n;
s->top = -1;
return s;
}
int empty(Stack *s) {
return s->top == -1;
}
int top(Stack *s) {
if (empty(s)) return 0;
return s->data[s->top];
}
int push(Stack *s, int val) {
if (s == NULL) return 0;
if (s->top + 1 == s->size) return 0;
s->top += 1;
s->data[s->top] = val;
return 1;
}
int pop(Stack *s) {
if (s == NULL) return 0;
if (empty(s)) return 0;
s->top -= 1;
return 1;
}
void clear(Stack *s) {
if (s == NULL) return ;
free(s->data);
free(s);
return ;
}
void output(Stack *s) {
printf("stack(%d) = [", s->top + 1);
for (int i = s->top; i >= 0; i--) {
printf(" %d", s->data[i]);
}
printf("]\n");
return ;
}
int main() {
srand(time(0));
#define MAX_OP 20
Stack *s = init(MAX_OP);
for (int i = 0; i < MAX_OP; i++) {
int op = rand() % 2, val = rand() % 100;
switch (op) {
case 0: {
printf("push %d to stack = %d\n", val, push(s, val));
} break;
case 1: {
printf("pop %d from stack = %d\n", top(s), pop(s));
}
}
output(s);
}
return 0;
}
三、栈的基本概念
如果有任何问题请留言
本文作者:HanaKoo
本文链接:https://www.cnblogs.com/HanaKoo/p/16098380.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!