数据结构学习笔记-堆栈

每一篇文章都是零评惨剧…

堆栈

堆栈的抽象数据类型描述

类型名称:堆栈(Stack)

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

操作集:

长度为MaxSize的堆栈S∈Stack,

堆栈元素item∈ElementType

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

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

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

栈的顺序存储实现

分析

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

代码

#include<iostream>
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<iostream>
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)++]);
	}
}

堆栈的链式存储实现

待更新…咩

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值