数据结构--栈

顺序栈--静态分配内存

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;
} 
相关推荐
灵感__idea9 小时前
Hello 算法:众里寻她千“百度”
前端·javascript·算法
Wect18 小时前
LeetCode 130. 被围绕的区域:两种解法详解(BFS/DFS)
前端·算法·typescript
NAGNIP1 天前
一文搞懂深度学习中的通用逼近定理!
人工智能·算法·面试
颜酱2 天前
单调栈:从模板到实战
javascript·后端·算法
CoovallyAIHub2 天前
仿生学突破:SILD模型如何让无人机在电力线迷宫中发现“隐形威胁”
深度学习·算法·计算机视觉
CoovallyAIHub2 天前
从春晚机器人到零样本革命:YOLO26-Pose姿态估计实战指南
深度学习·算法·计算机视觉
CoovallyAIHub2 天前
Le-DETR:省80%预训练数据,这个实时检测Transformer刷新SOTA|Georgia Tech & 北交大
深度学习·算法·计算机视觉
CoovallyAIHub2 天前
强化学习凭什么比监督学习更聪明?RL的“聪明”并非来自算法,而是因为它学会了“挑食”
深度学习·算法·计算机视觉
CoovallyAIHub2 天前
YOLO-IOD深度解析:打破实时增量目标检测的三重知识冲突
深度学习·算法·计算机视觉
NAGNIP2 天前
轻松搞懂全连接神经网络结构!
人工智能·算法·面试