算法未动 粮草先行(基础篇二---栈)

栈:顺序表或单链表的一种特殊表现形式

栈(stack)又名堆栈,它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。
–来源:百度百科

2.1定义

栈中的元素满足先进后出规则
栈是一种线性表
将栈的表头称为栈底(bottom)
将栈的表尾称为栈顶(top)
将元素添加进栈称为入栈(push)
将栈顶元素删除称为出栈(pop)
在这里插入图片描述

栈一旦形成,栈底的位置就确定不变
没有任何元素的栈是空栈
在这里插入图片描述
随着栈内元素的增多,栈顶指针会逐步上升
随着元素的出栈,栈顶指针会下移靠近栈底指针
一旦栈顶指针越过栈底指针 栈就清空为空栈

template<typename DataType>class Stack
{
public:
	Stack(int size)
	{
		maxSize = size;
		top = -1;
		elements = new DataType[size];
	}
	~Stack()
	{
		delete [] elements;
	}
	bool push(DataType data);
	DataType pop();
	bool isempty();
	bool isfull();
	DataType getTop();
private:
	DataType *elements;
	int top;
	int maxSize;
};

2.2基本操作

栈的基本操作有入栈,出栈,判空,判满,返回栈顶元素

2.2.1入栈操作

在表尾(栈顶)插入元素

template <typename DataType>bool Stack<DataType>::push(DataType data)
{
	if (top==maxSzie)
		return false;
	elements[++top]=data;
	return true;
}
2.2.2出栈操作

在表尾(栈顶)弹出元素 并获得其值

template <typename DataType>DataType Stack<DataType>::pop()
{
	if(pop==-1)
		exit(1);//直接结束程序,遇到了逻辑错误
	return elements[top--];
}
2.2.3判空操作
template <typename DataType>bool Stack<DataType>::isempty()
{
	if(pop==-1)
		return true;
	return false;
}
2.2.3判满操作
template <typename DataType>bool Stack<DataType>::isfull()
{
	if (top==maxSzie)
		return true;
	return false;
}
2.2.4取栈顶元素
template <typename DataType>DataType Stack<DataType>::pop()
{
	if(pop==-1)
		exit(1);//直接结束程序,遇到了逻辑错误
	return elements[top];
}

2.3实例应用

请读者自行训练

1.将整数集合{12,4325,6,23,8,4}一次存入某种数据结构,要求输出结果为6,23,4325,4,8,12
可以利用栈的先进后出规则 功能
具体流程:
逐个将元素按顺序压入栈 每次都判断栈顶元素是否为当前可输出元素
代码实现:

2.给栈添加一个min函数 要求在调用此函数时,能够返回一个当前栈内的最小值 复杂度要求O(1)
分析:
(1)对push函数进行修改:在入栈时,如果当前入栈的值n小于当前最小值min,更新min的值为n,将n-min的值入栈,否则直接将n-min的值入栈
(2)对pop函数进行修改:如果栈顶元素top小于等于0,则说明此时的元素栈顶元素为当前最小元素min,则出栈时直接弹出当前的最小值,同时更新min值为min-top;如果栈顶元素大于0,则返回top+min
(3)min函数:之间返回记录的值即可

启用min函数前需要进行判空

参考书籍《妙趣横生的算法(C++语言实现)》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值