数据结构与算法--栈

数据结构与算法之顺序栈

简介:

栈也是一种受限制的线性表,与队列刚好相反,队列的特性是先进先出,而的特性是先进后出;只可在其一端(栈顶)进行(进出)操作。 操作数据的一端我们通常称为栈顶(top),另外一段称为栈底(base)。栈的存储结构大致如下:
在这里插入图片描述
我们可以把栈结构大致看成一个装书的箱子,我们只能在箱子的顶部进行放书和拿书,先放进去的(高数)书会在箱子的最底部,后放的(英语)书会压在先放的高数上面,如果你想要拿到高数,那么就不得不先取出英语书,然后才能拿到高数书。

代码实现:

1. 初始化栈:

注意:顺序栈是以数组方式存储,下标从0开始

top为栈顶指针,base为栈底指针。

#define MAX_SIZE  128	//栈的最大容量

typedef int ElemType;

// 栈结构体
typedef struct _SqStack {
	ElemType* top;		//栈顶指针
	ElemType* base;		//栈底指针
}SqStack;

// 初始化栈
bool initSqStack(SqStack &S) {
	S.base = new ElemType[MAX_SIZE];
	if (!S.base) return false;	//空间分配失败

	S.top = S.base;
	return true;
}
2. 入栈

入栈后使栈顶指针top指向下一个位置,方便下一次入栈

// 入栈
bool pushStack(SqStack& S, ElemType data) {
	if (isFull(S)) return false; //判断栈是否为满

	*(S.top++) = data; //将第二个参数传来的数据入栈
	return true;
}

// 判断栈是否为满
bool isFull(SqStack& S) {
	// MAX_SIZE 为栈的最大容量
	if ((S.top - S.base) == MAX_SIZE) return true;
	return false;
}
3. 出栈

因为栈顶指针是指向下一个位置的,所以先自减一后再赋值到data

// 出栈
bool popStack(SqStack& S, ElemType &data) {
	if (isEmpty(S)) return false;	//判断栈是否为空

	data = *(--S.top);
	return true;
}

// 判断栈是否为空
bool isEmpty(SqStack& S) {
	if (S.top == S.base) return true;
	return false;
}
4. 获取栈顶元素和栈中元素个数

由图可知,栈中元素的个数可由 栈顶指针减去栈底指针获得
在这里插入图片描述

// 获取栈顶元素
bool GetTopElem(SqStack& S, ElemType &data) {
	if (isEmpty(S)) return false;

	data = *(S.top - 1);
	return true;
}

// 返回栈中元素个数
int GetSize(SqStack& S) {
	return (S.top - S.base);
}
5.销毁栈
// 销毁顺序栈
void destroyStack(SqStack& S) {
	if (S.base) { //若栈存在,则释放资源
		delete[] S.base;
		S.top = S.base = NULL;
	}
}

代码实现:

#include <iostream>

using namespace std;

#define MAX_SIZE  128	//栈的最大容量

typedef int ElemType;

// 栈结构体
typedef struct _SqStack {
	ElemType* top;		//栈顶指针
	ElemType* base;		//栈底指针
}SqStack;

bool isEmpty(SqStack& S);
bool isFull(SqStack& S);

// 初始化栈
bool initSqStack(SqStack &S) {
	S.base = new ElemType[MAX_SIZE];
	if (!S.base) return false;	//空间分配失败

	S.top = S.base;
	return true;
}

// 入栈
bool pushStack(SqStack& S, ElemType data) {
	if (isFull(S)) return false;

	*(S.top++) = data;
	return true;
}

// 出栈
bool popStack(SqStack& S, ElemType &data) {
	if (isEmpty(S)) return false;

	data = *(--S.top);
	return true;
}

// 获取栈顶元素
bool GetTopElem(SqStack& S, ElemType &data) {
	if (isEmpty(S)) return false;

	data = *(S.top - 1);
	return true;
}

// 返回栈中元素个数
int GetSize(SqStack& S) {
	return (S.top - S.base);
}

// 判断栈是否为满
bool isFull(SqStack& S) {
	if ((S.top - S.base) == MAX_SIZE) return true;
	return false;
}

// 判断栈是否为空
bool isEmpty(SqStack& S) {
	if (S.top == S.base) return true;
	return false;
}

// 销毁顺序栈
void destroyStack(SqStack& S) {
	if (S.base) {
		delete[] S.base;
		S.top = S.base = NULL;
	}
}

int main(void) {
	SqStack S;
	if (initSqStack(S))
		cout << "栈初始化成功!" << endl;
	else
		cout << "栈初始化失败!" << endl;

	int data = 0;
	for (size_t i = 0; i < 6; i++)
	{
		cout << "请输入元素:";
		cin >> data;
		pushStack(S,data);
	}

	cout << "栈中元素个数为:" << GetSize(S) << endl;

	cout << "出栈元素为:";
	for (size_t i = 0; i < 6; i++)
	{
		popStack(S, data);
		cout << data << " ";
	}
	cout << endl;

	cout << "栈中元素个数为:" << GetSize(S) << endl;

	destroyStack(S);

	return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值