数据结构(C语言)——栈的两种实现方式

下面来介绍栈的两种实现方式:

一、数组

cpp 复制代码
#include<stdio.h>
#include<stdlib.h>
#define E int
#define MAX_STACK 5
//数据结构-栈(数组实现)
typedef struct my_stack {
	E *sta;//栈大小为5
	int pos;//栈顶位置
}my_stack;
//初始化栈
void initialise(my_stack* stack) {
	stack->sta = (E*)malloc(MAX_STACK * sizeof(E));
	if (stack->sta == NULL) return;
	stack->pos = -1;
}
//没满就返回假
int is_full(my_stack* stack) {
	return (stack->pos == MAX_STACK-1);
}
//进栈
int push_stack(my_stack* stack, E ele) {
	if (is_full(stack))return 0;
	stack->sta[++stack->pos] = ele;
	return 1;
}
//出栈
E poll_stack(my_stack* stack) {
	if (stack->pos < 0)return 0;
	return stack->sta[stack->pos--];
}
int main() {
	my_stack stack;
	initialise(&stack);
	for (int i = 1; i <= 5; i++) {
		push_stack(&stack, 20*i);
	}
	for (int i = 0; i < 5; i++) {
		printf("%d\n", poll_stack(&stack));
	}
	return 0;
}

二、单链表

相对于数组实现来说,单链表实现会稍微复杂点

注:头文件和宏定义与上面一样

cpp 复制代码
typedef struct my_list {
	E element;
	struct my_stact* next;
}List;
typedef struct my_stact {
	List* list;
	int size;
}my_stact;
//初始化
void initialise(my_stact* stack) {
	stack->list = NULL;
	stack->size = 0;
}
int is_full(my_stact* stack) {
	return (stack->size == MAX_STACK);
}
int push_stack(my_stact* stack, E ele) {
	if (is_full(stack)) return 0;
	List* tem = stack->list;
	int flag = 0;
	for (int i = 0; i < stack->size; i++) {
		if (i >= 1)
			tem = tem->next;
		flag++;
	}
	List* ptr = (List*)malloc(sizeof(List));//开辟空间
	if (ptr== NULL)return 0;//为空开辟失败
	ptr->next = NULL;//将新开辟的节点的下一节点指针置为空
	ptr->element = ele;
	if (flag == 0) { 
		stack->list = ptr; 
		stack->size++;
		return 1;
	}//首次开辟节点情况
	tem->next = ptr;//非第一个元素情况
	stack->size++;
	return 1;
}
E poll_stack(my_stact* stack) {
	if (stack->size == 0)return 0;
	List* tem = stack->list;
	for (int i = 0; i < stack->size; i++) {
		if(i>=1)
		tem = tem->next;//移动节点
	}
	E e = tem->element;
	stack->size--;
	free(tem);
	tem = NULL;
	return e;
}
int main() {
	my_stact stact;
	initialise(&stact);
	for (int i = 1; i <= 5; i++) {
		push_stack(&stact, 20*i);
	}
	for (int i = 0; i < 5; i++) {
		printf("%d\n", poll_stack(&stact));
	}
	return 0;
}
相关推荐
liuluyang5301 小时前
C语言C11支持的结构体嵌套的用法
c语言·开发语言·算法·编译·c11
明飞19872 小时前
C_内存 内存地址概念
c语言·开发语言
勤劳的进取家2 小时前
贪心算法之最小生成树问题
数据结构·python·算法·贪心算法·排序算法·动态规划
牛奶咖啡.8542 小时前
第十四届蓝桥杯大赛软件赛省赛C/C++ 大学 A 组真题
c语言·数据结构·c++·算法·蓝桥杯
亓才孓2 小时前
[leetcode]stack的基本操作的回顾
算法
小美爱刷题2 小时前
力扣DAY46-50 | 热100 | 二叉树:展开为链表、pre+inorder构建、路径总和、最近公共祖先、最大路径和
算法·leetcode·链表
Fanxt_Ja3 小时前
【数据结构】红黑树超详解 ---一篇通关红黑树原理(含源码解析+动态构建红黑树)
java·数据结构·算法·红黑树
永恒迷星.by3 小时前
全球变暖(蓝桥杯 2018 年第九届省赛)
算法
那就摆吧4 小时前
数据结构-复杂度详解
数据结构
旧时光林4 小时前
蓝桥杯 分解质因数(唯一分解定理)
数据结构·c++·算法·蓝桥杯·模拟·枚举