数据结构--栈

顺序栈--静态分配内存

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;
} 
相关推荐
胖咕噜的稞达鸭7 小时前
算法日记:穷举vs暴搜vs深搜vs回溯vs剪枝--全排列
算法·深度优先·剪枝
Figo_Cheung7 小时前
Figo关于热、声、光的物理本质辨析——从根本上解释了光速的恒定性与声速的介质依赖性,揭示了光热转换的微观场论机制
算法·机器学习
青桔柠薯片7 小时前
数据结构:排序与算法
数据结构·排序算法
格林威7 小时前
Baumer相机轴承滚珠缺失检测:用于精密装配验证的 6 个核心算法,附 OpenCV+Halcon 实战代码!
人工智能·opencv·算法·计算机视觉·视觉检测·工业相机·堡盟相机
一起养小猫7 小时前
Flutter for OpenHarmony 实战:2048游戏算法与优化深度解析
算法·flutter·游戏
执着2597 小时前
力扣hot100 - 226、翻转二叉树
数据结构·算法·leetcode
-Try hard-7 小时前
排序和查找算法:插入排序、希尔排序、快速排序以及二分查找
数据结构·算法·排序算法
Ivanqhz7 小时前
向量化计算
开发语言·c++·后端·算法·支持向量机·rust
ffqws_7 小时前
进阶搜索:迭代加深搜索(IDS)埃及分数题解
算法·迭代加深
格林威7 小时前
相机的“对焦”和“变焦”,这二者有什么区别?
开发语言·人工智能·数码相机·opencv·算法·计算机视觉·视觉检测