加入收藏 | 设为首页 | 会员中心 | 我要投稿 拼字网 - 核心网 (https://www.hexinwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

数据结构学习笔记-堆栈

发布时间:2022-11-04 18:00:51 所属栏目:大数据 来源:转载
导读: 每一篇文章都是零评惨剧… 堆栈 堆栈的抽象数据类型描述
类型名称:堆栈(Stack)
数据对象集:一个有0个或多个元素的有穷线性表
操作集:
长度为MaxSize的堆栈S∈Stack,
堆栈元素item∈Element

每一篇文章都是零评惨剧… 堆栈 堆栈的抽象数据类型描述

类型名称:堆栈(Stack)

数据对象集:一个有0个或多个元素的有穷线性表

操作集:

长度为MaxSize的堆栈S∈Stack,

堆栈元素item∈ElementType

Stack CreateStack(int MaxSize): 生成空堆栈,最大长度MaxSizeint IsFull(Stack S,int MaxSize): 判断堆栈S是否已满void Push(Stack S, ElementType item) : 将元素item压入堆栈int IsEmpty(Stack S) : 判断堆栈S是否已空ElementType Pop (Stack S) : 删除并返回栈顶元素

压入元素和删除元素都要判断堆栈是否满了或者空了

空了就不能删除了,满了就不能压入元素了

栈的顺序存储实现 分析

栈的顺序存储结构通常由一个一维数组和一个记录栈顶元素位置的变量组成

代码

#include
using namespace std;
#define MaxSize 100 //储存数据元素的最大个数
typedef struct SNode* Stack;
struct SNode {
	int Data[MaxSize]; //数据元素(ElementType Data[MaxSize])
	int Top; //栈顶(数组下标)
};
//入栈
void Push(Stack PtrS, int item) {
	//Ptrs是一个结构指针
	//如果栈满,不可以压入数据元素
	if (PtrS->Top == MaxSize - 1)
		cout << "堆栈满了" << endl;
	//举个例子
	//MaxSize为100,最小下标为0,最大下标99
	//如果栈顶等于99(MaxSize - 1) 则栈满
	else {
		PtrS->Data[++(PtrS->Top)] = item;
		//做了两件事
		//先Top+1,之后将item存入Data[Top]中
		//举个栗子
		//堆栈为空,Top默认为-1,当执行Push之后,先Top+1,Top为0
		//再将元素存入Data[Top]
		return;
	}
}
//出战
int Pop(Stack PtrS) {
	//如果栈空,Top默认为-1, 没有元素可以出栈
	if (PtrS->Top == -1) {
		cout << "堆栈为空";
		return -1; //-1表示ERROR,表示错误,为ElementType的特殊值
	}
	else {
		//先出栈栈顶元素,再栈顶-1
		//如果栈顶为1,则目前堆栈有两个元素,下标为0和1.
		//出栈先Pop下标为1元素,再-1,Top为0
		return (PtrS->Data[(PtrS->Top)--]);
		//如果Top为-1,则是空的
	}
}

请用一个数组实现两个堆栈大数据堆栈,要求最大地利用数组空间,使数组只要有空间入栈操作就可以成功。 分析

一种比较聪明的方法是使这两个栈分别从数组的两头开始向中间生长:当两个栈的栈顶指针相遇时,表示两个栈都满了。

代码

#include
using namespace std;
#define MaxSize 100
//双向堆栈,两边向中间增长
struct DStack {
	int Data[MaxSize];
	int Top1 = -1; //堆栈1栈顶指针
	int Top2 = MaxSize; //堆栈2栈顶指针
};
//入栈
void Push(struct DStack* PtrS, int item, int Tag) {
	//Tag是两个堆栈的标志,取值为1和2
	//判断栈满
	if ( PtrS->Top2 - PtrS->Top1 == 1 ){
		//当两个指针相遇了,下标差为1,那就是栈满了
		cout << "栈满啦!" << endl;
		return;
	}
	//操作第一个栈
	if (Tag == 1)
		PtrS->Data[++(PtrS->Top1)] = item;
	//将元素存入Top后面的位置
	else 
		PtrS->Data[--(PtrS->Top2)] = item;
	//将元素存入MaxSize前面的位置
}
//出栈
int Pop(struct DStack* PtrS, int Tag) {
	//对第一个栈操作
	if (Tag == 1) {
		//判断栈空
		if (PtrS->Top1 == -1) {
			cout << "堆栈1空!无数据!" << endl;
			return NULL;
		}
		else
			return (PtrS->Data[(PtrS->Top1)--]);
	}
	//对第二个栈操作
	if (Tag == 2){
		//判断栈空
		if (PtrS->Top2 == MaxSize){
			cout << "堆栈2空!无数据!" << endl;
			return NULL;
		}
		else
			return (PtrS->Data[(PtrS->Top2)++]);
	}
}

堆栈的链式存储实现 待更新…咩

(编辑:拼字网 - 核心网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!