数据结构--栈

顺序栈--静态分配内存

cpp 复制代码
/*
栈 是限定仅在表尾进行插入或删除操作的线性表
对于栈来说,表尾端称为栈顶,表头端称为栈底,不含元素的空表称为空i怕
栈为先进后出
栈是限制插入和删除操作只能在一个位置进行的表,该位置是表的末端 
对于栈的基本操作只有进栈和出栈 
*/ 
//栈的顺序结构实现 
#include <stdio.h>
#define MAXSIZE 100

typedef int ElemType;
typedef struct{
	ElemType data[MAXSIZE];
	int top; 
}Stack; 

//栈的初始化
void initStack(Stack *s)
{
	s->top = -1;
}
//判断栈是否为空
int isEmpty(Stack *s)
{
	if(s->top == -1)
	{
		printf("栈为空\n");
		return 1;
	}
	else
	{
		return 0;
	}
}
//压栈
int push(Stack *s,ElemType e)
{
	if(s->top >= MAXSIZE - 1)
	{
		printf("满了\n");
		return 0;	
	}	
	s->top ++;
	s->data[s->top] = e;
	return 1;
} 
//出栈
ElemType pop(Stack* s,ElemType *e)
{
	if(s->top == -1)
	{
		printf("空的\n");
		return 0;	
	}	
	*e = s->data[s->top];
	s->top --;
	return 1;
} 
//获取栈顶元素
int getTop(Stack* s,ElemType *e)
{
	if(s->top == -1)
	{
		printf("空的\n");
		return 0;
	}
	*e = s->data[s->top];
	return 1;
}
cpp 复制代码
int main()
{
	Stack s;
	initStack(&s);
	push(&s,10);
	push(&s,20);
	ElemType e1;
	getTop(&s,&e1);
	printf("栈顶元素为:%d\n",e1);
	ElemType e2;
	pop(&s,&e2);
	printf("pop出的元素为:%d\n",e2);
	getTop(&s,&e1);
	printf("栈顶元素为:%d\n",e1);
	return 0;
} 

栈---动态分配内存

cpp 复制代码
typedef int ElemType;
typedef struct{
	ElemType *data;
	int top; 
}Stack; 

//栈的初始化
Stack* initStack()
{
	Stack *s = (Stack*)malloc(sizeof(Stack));
	s->data = (ElemType*)malloc(sizeof(ElemType) * MAXSIZE);
	s->top = -1;
	return s;
}

出栈和入栈部分上面的代码都可以用

栈--链式结构

cpp 复制代码
//栈的链式结构实现
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 100

typedef int ElemType;
typedef struct stack{
	ElemType data;
	struct stack *next; 
}Stack; 

//栈的初始化
Stack* initStack()
{
	Stack *s = (Stack*)malloc(sizeof(Stack));
	s->data = 0;
	s->next = NULL;
	return s;
}
//判断栈是否为空
int isEmpty(Stack *s)
{
	if(s->next == NULL)
	{
		printf("栈为空\n");
		return 1;
	}
	else
	{
		return 0;
	}
}
//压栈
int push(Stack *s,ElemType e)
{
	Stack *p = (Stack*)malloc(sizeof(Stack));
	p->data = e;
	p->next = s->next;
	s->next = p;
	return 1;
} 
//出栈
ElemType pop(Stack* s,ElemType *e)
{
	if(s->next == NULL)
	{
		printf("空的\n");
		return 0;	
	}	
	*e = s->next->data;
	Stack* q = s->next;
	s->next = q->next;
	free(q);
	return 1;
} 
//获取栈顶元素
int getTop(Stack* s,ElemType *e)
{
	if(s->next == NULL)
	{
		printf("空的\n");
		return 0;
	}
	*e = s->next->data;
	return 1;
}
cpp 复制代码
int main()
{
	Stack *s = initStack();
	push(s,10);
	push(s,20);
	ElemType e1;
	getTop(s,&e1);
	printf("栈顶元素为:%d\n",e1);
	ElemType e2;
	pop(s,&e2);
	printf("pop出的元素为:%d\n",e2);
	getTop(s,&e1);
	printf("栈顶元素为:%d\n",e1);
	return 0;
} 
相关推荐
你撅嘴真丑9 小时前
第九章-数字三角形
算法
uesowys9 小时前
Apache Spark算法开发指导-One-vs-Rest classifier
人工智能·算法·spark
ValhallaCoder9 小时前
hot100-二叉树I
数据结构·python·算法·二叉树
董董灿是个攻城狮9 小时前
AI 视觉连载1:像素
算法
智驱力人工智能10 小时前
小区高空抛物AI实时预警方案 筑牢社区头顶安全的实践 高空抛物检测 高空抛物监控安装教程 高空抛物误报率优化方案 高空抛物监控案例分享
人工智能·深度学习·opencv·算法·安全·yolo·边缘计算
孞㐑¥10 小时前
算法——BFS
开发语言·c++·经验分享·笔记·算法
月挽清风10 小时前
代码随想录第十五天
数据结构·算法·leetcode
XX風11 小时前
8.1 PFH&&FPFH
图像处理·算法
NEXT0611 小时前
前端算法:从 O(n²) 到 O(n),列表转树的极致优化
前端·数据结构·算法
代码游侠11 小时前
学习笔记——设备树基础
linux·运维·开发语言·单片机·算法