栈
栈:顺序表或单链表的一种特殊表现形式
栈(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++语言实现)》